2010-04-13 3 views
18

Я хочу настроить поисковую систему Solr, чтобы получить точное соответствие для поискового запроса, который я вводил.Solr точное слово поиска

например. «налоги» должны возвращать документы с «налогами», а не «налог», «налогообложение» и т. д.

Любая помощь или советы будут оценены.

ответ

21

Я предполагаю, что ваше поле является TextField, по умолчанию solr выполняет поиск по нечеткому полю в этом поле. Вы хотите настроить поле как поле строки и не добавлять токенизатор, тогда вы получите точное соответствие.

Вы можете даже комбинировать точный поиск с помощью нечеткого поиска и использовать DisMax для повышения относительных весов.

Пример (schema.xml):

<field name="name"    type="string" indexed="true" stored="false" required="true" /> 
<field name="nameString"  type="string" indexed="true" stored="false" required="true" /> 
<copyField source="name" dest="nameString"/> 

Пример (solrconfig.xml):

<requestHandler name="accounts" class="solr.SearchHandler"> 
    <lst name="defaults"> 
     <str name="defType">dismax</str> 
     <str name="qf"> 
     nameString^10.0 name^5.0 description^1.0 
     </str> 
     <str name="tie">0.1</str> 
    </lst> 
    </requestHandler> 
+4

Возможно ли это во время запроса со специальным оператором? Например = налоги – mlissner

+0

@mlissner, приведенный выше XML - это просто параметры по умолчанию, которые добавляются в запрос. U мог бы сделать это, добавив к вашему запросу defType = dismax & qa = nameString^10.0 name^5.0 description^1.0 и т. Д. –

+0

@ItayMoav, цель состоит в том, чтобы * пользователи * могли разместить точный запрос соответствия. – mlissner

4

Отключить stemming.

+1

Спасибо Hank, может быть, я должен был сформулирован мой вопрос уместнее, Как отключить вытекающие? :) – Ruth

+2

Использовал тип текстового поля и переиндексировал его, сделал трюк – Ruth

+0

см. Http://lucene.472066.n3.nabble.com/Exact-match-on-a-field-with-stemming-tt2808086.html#a2809293 –

3

Чтобы отключить вытекающие в вашем schema.xml, вы можете определить текстовое поле, как это:

<types> 

    <!-- other fields definition --> 

    <fieldType name="text_no_stem" class="solr.TextField" omitNorms="false"> 
     <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.StandardFilterFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <!-- other fields definition --> 

</types> 

<fields> 

    <!-- other fields definition --> 

    <dynamicField name="*_nostem" type="text_no_stem" indexed="true" stored="true"/> 

    <!-- other fields definition --> 

</fields> 

Я использую sunspot интеграции Solr с Ruby On Rails. При этом в schema.xml я определяю мой для поиска блока, как это:

searchable do 
    text(:wants, as: :wants_nostem) 
end 
1

Используйте SOLR строкового поля whcih будет делать поиск точного значение, например

<fieldType class="solr.StrField" name="string" omitNorms="true" sortMissingLast="true" /> 
Смежные вопросы