основной полнотекстовый поиск с солярием

Просто попробуйте Solr в сочетании с солярием для формы поиска на сайте.
Я хотел бы найти комбинацию слов, таких как «слово1 слово2 слово3» во всех столбцах, и получить результаты, отсортированные по наибольшему количеству результатов поиска.

Я успешно импортировал все данные в базу данных solr, и простой пример выбора из солярия выдает следующее:

NumFound: 21421

С несколькими подробными результатами.

Как только я начинаю добавлять слова для поиска, я получаю 0 результатов. Когда я указываю столбец поиска, например, «body: word1», поиск работает и возвращает результаты. я делаю что-то не так в коде де-поиска или у меня неправильная конфигурация?

Поиск кода:

// create a client instance
$client = new Solarium_Client($config);

// get a select query instance
$query = $client->createSelect();
$query->setFields(array('id','title','description','body'));
#$query->setQuery("searchTerm"); //this does not work
#$query->setQuery("body:searchTerm"); //this does work

// this executes the query and returns the result
$resultset = $client->select($query);

// display the total number of documents found by solr
echo 'NumFound: '.$resultset->getNumFound();

schema.xml

<?xml version="1.0" encoding="UTF-8" ?><schema name="example" version="1.5">

<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="description" type="text_general" indexed="true" stored="true"/>
<field name="body" type="text_general" indexed="true" stored="true"/>
<field name="content" type="text_general" indexed="false" stored="true" multiValued="true"/>
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<uniqueKey>id</uniqueKey>

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />

<!-- boolean type: "true" or "false" -->
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>

<fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
<fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>

<!-- lowercases the entire field value, keeping it as a single token.  -->
<fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
</schema>

2

Решение

Вы должны указать поля поиска.
Если вы хотите выполнить поиск по всем полям, то вы должны сделать это:

$query->setQuery("*:searchTerm");

Или, альтернативно, вы можете использовать dismax/edismax тип запроса:

$dismax = $query->getDisMax();
$dismax->setQueryFields('theFieldIwantToLookInto1 theFieldIwantToLookInto2');

$query->setQuery('searchTerm');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]