2011-09-21 1 views
6

Я использую SOLR 3.2. Мое приложение выдает поисковые запросы в экземпляре SOLR для типа текстового поля. Как я могу заставить SOLR возвращать такие результаты, как «книга», «книжная полка», «bookasd» и т. Д., Когда пользователь выдает запрос типа «книга». Должен ли я добавлять символы «*» в строку запроса вручную или есть параметр в SOLR, поэтому он будет выполнять префиксные поиски по полю по умолчанию?Как настроить SOLR, чтобы пользователи могли делать префиксный поиск по умолчанию?

Это раздел schema.xml для типа текстового поля:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="stopwords.txt" 
       enablePositionIncrements="true" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
     <analyzer type="query"> 
     <charFilter class="solr.HTMLStripCharFilterFactory"/> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenat0All="1" splitOnCaseChange="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
     </analyzer> 
    </fieldType> 
+0

Вы нашли ответ еще? –

ответ

0

Вы должны либо сделать обработку на стороне клиента, добавляя подстановочные символы в конце поиска.

Воздействие: -

  1. подстановочные запросы имеют влияние на производительность
  2. подстановочные запросы не проходят анализ. Таким образом, анализ времени запроса не будет применяться к вашим поисковым запросам

Другой вариант - реализовать пользовательский анализатор запросов с необходимой обработкой.

1

У меня было такое же требование к проекту. Мне пришлось реализовать предложение. Что я сделал, это определение Suggester FieldType

<fieldType class="solr.TextField" name="suggester"> 
    <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3" outputUnigrams="true" outputUnigramsIfNoShingles="false" /> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" enablePositionIncrements="true" /> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

я использовал ShingleFilterFactory потому что мне нужно, чтобы получить предложение, состоящее из одного рудных более слов.

Затем я использовал факельные запросы, чтобы получить предложения.

Facet.Limit = 10

Facet.Prefix = "Книга"

Facet.Field = "Suggester" // это поле с FieldType = "Suggester", в котором я сохраненные данные

Я знаю, что он использует результаты фасет, но, возможно, он решает вашу проблему.

Если мои или Jayendra Patil's answer не дает вам решение, которое вы также можете взглянуть на EdgeNGramFilterFactory

2

Есть несколько способов сделать это, но производительность мудрым вы можете захотеть использовать EdgeNgramFilterFacortory

0

Я Конечно, вы поняли это до сих пор, но просто так есть ответ здесь:

Я обработал это, взяв последний термин и положив OR с последним термином плюс подстановочный знак, например «Моя любимая книга» становится «моей + любимой + (книга OR book *)» и вернет «мою любимую книжную полку». Вероятно, вы захотите выполнить некоторую обработку на входе (экранирование и т. Д.).

Если вы специально ищете текст, набранный в соответствии с началом результата, то краевые n-граммы - это путь, но, читая ваш вопрос, казалось, вы действительно не просили об этом.

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

  • Нет связанных вопросов^_^