2014-12-18 5 views
2

Просто попробуйте Solr в сочетании с Solarium для поиска на веб-сайте. Я бы хотел найти комбинацию слов типа word1 word2 word3 во всех столбцах и получить результаты, отсортированные по наивысшей оценке поиска.базовый полный текстовый поиск с солярием

Я успешно импортированы все данные в базе данных 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> 

ответ

1

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

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

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

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

$query->setQuery('searchTerm'); 
+0

Thx! Улыбка работает, «*: searchTerm» не тогда, когда я использую, что он говорит «плохой запрос», – Jeroen