Точный поиск слов Solr
Я хочу настроить свою поисковую систему Solr, чтобы получить точное соответствие для поискового запроса, который я вводил.
например. "налоги" должны возвращать документы с "налогами", а не "налог", "налогообложение" и т.д.
Любая помощь или советы будут оценены.
Ответы
Ответ 1
Я предполагаю, что ваше поле является 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>
Ответ 2
Отключите stemming.
Ответ 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
Ответ 4
Используйте поле строки solr, которое будет выполнять поиск точных значений, например
<fieldType class="solr.StrField" name="string" omitNorms="true" sortMissingLast="true" />
Ответ 5
Используйте кавычки для получения точного соответствия:
Пример:
имя ядра: core1
Ключ: namestring
http://localhost:8983/solr/core1/select?q=namestring: "tax" & wt = json & indent = true