2015-02-18 2 views
2

У меня возникла проблема с поиском релевантных результатов поиска, работающих со словами с дефисами и без них. Я создал два документа, один с «wifi» и один с «wi-fi» в поле «text».Поиск Solr с дефисом

При поиске «wifi» оба документа отображаются в результатах поиска, что хорошо. При поиске «wi-fi» в результатах поиска появляется только документ с «wi-fi».

Вот моя конфигурация:

<field name="text" type="text" indexed="true" stored="true" omitNorms="true" /> 

<fieldType name="text" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <filter class="solr.ASCIIFoldingFilterFactory" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

Вот результат analyzis: https://www.evernote.com/shard/s7/sh/f1bab83a-7fd5-4bf3-9e67-239ea0c71441/98b1103577638734fb9335f755591b82/deep/0/Solr-Admin-(jeanfrancoiscote.egzakt.com).png

Debug запроса при поиске "Wi-Fi". Я не могу понять, почему он не найдет оба документа:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 

<lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">1</int> 
    <lst name="params"> 
    <str name="debugQuery">true</str> 
    <str name="indent">true</str> 
    <str name="q">wi-fi</str> 
    <str name="wt">xml</str> 
    </lst> 
</lst> 
<result name="response" numFound="1" start="0"> 
    <doc> 
    <int name="id">1869</int> 
    <str name="route">@sujet_simple?sujet_id=1869&amp;slug=wi-fi</str> 
    <str name="name">Wi-fi</str> 
    <str name="text">&lt;p&gt; 
    Wi-fi&lt;/p&gt; 
</str> 
    <long name="_version_">1493472450933948416</long></doc> 
</result> 
<lst name="debug"> 
    <str name="rawquerystring">wi-fi</str> 
    <str name="querystring">wi-fi</str> 
    <str name="parsedquery">MultiPhraseQuery(text:"(wi-fi wi) (fi wifi)")</str> 
    <str name="parsedquery_toString">text:"(wi-fi wi) (fi wifi)"</str> 
    <lst name="explain"> 
    <str name="1869"> 
30.33298 = (MATCH) weight(text:"(wi-fi wi) (fi wifi)" in 0) [DefaultSimilarity], result of: 
    30.33298 = score(doc=0,freq=1.0 = phraseFreq=1.0 
), product of: 
    0.99999994 = queryWeight, product of: 
     30.332981 = idf(), sum of: 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.2791467 = idf(docFreq=2, maxDocs=1600) 
     0.032967415 = queryNorm 
    30.332981 = fieldWeight in 0, product of: 
     1.0 = tf(freq=1.0), with freq of: 
     1.0 = phraseFreq=1.0 
     30.332981 = idf(), sum of: 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.684612 = idf(docFreq=1, maxDocs=1600) 
     7.2791467 = idf(docFreq=2, maxDocs=1600) 
     1.0 = fieldNorm(doc=0) 
</str> 
    </lst> 
    <str name="QParser">LuceneQParser</str> 
    <lst name="timing"> 
    <double name="time">1.0</double> 
    <lst name="prepare"> 
     <double name="time">0.0</double> 
     <lst name="query"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="facet"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="mlt"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="highlight"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="stats"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="debug"> 
     <double name="time">0.0</double> 
     </lst> 
    </lst> 
    <lst name="process"> 
     <double name="time">1.0</double> 
     <lst name="query"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="facet"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="mlt"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="highlight"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="stats"> 
     <double name="time">0.0</double> 
     </lst> 
     <lst name="debug"> 
     <double name="time">1.0</double> 
     </lst> 
    </lst> 
    </lst> 
</lst> 
</response> 

Спасибо за вашу помощь.

+0

любой удачи до сих пор? –

+0

Нет, еще не найдено. – Tiois

+0

Вам может быть интересен аналогичный вопрос, который я опубликовал недавно: http://stackoverflow.com/questions/29783237/solr-search-with-various-combinations-of-space-hyphen-casing-and-punctuations –

ответ

1

Вам необходимо отрегулировать сторону анализа вашей схемы. debugQuery = true, а инструменты Solr Analysis - ваши друзья для поиска таких ошибок.

Принимая конфигурацию поиск WiFi производит следующий запрос:

wifi 
"parsedquery_toString": "text:wifi", 

и WiFi

wi-fi 
"parsedquery_toString": "text:\"(wi-fi wi) (fi wifi)\"", 

Анализ стороны нашей конфигурации, генерирующего NONE условия соответствия для Wi-Fi.

Если мы изменим фильтр на стороне анализа не производить части слова:

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 

Мы получаем следующие фразы поиска, сгенерированные для WiFi

parsedquery_toString": "text:wifi", 

и Wi-Fi:

"parsedquery_toString": "text:wi-fi text:wifi" 

которые соответствуют индексированным термином для wi-fi и wifi из инструмента анализа

wi-fi, wi, fi, wifi 
wifi 

Примечание: текст нашего поля по умолчанию в этом примере

Смежные вопросы