Поиск по запросу
Я использую Solr 5.5, и у меня есть проблема, которую я надеюсь найти решение здесь.
У меня есть поле, которое я создал, используя следующие настройки:
<field name="exactName_noAlias_en_US" type="text_exact_query_tokenized" indexed="true" stored="false"/>
<fieldtype name="text_exact_query_tokenized" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="true"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="10"/>
</analyzer>
</fieldtype>
Это поле может иметь значение, например: "Джастин Бибер"
И мои ожидания следующие:
Для запроса "Художник Джастин Бибер - сердцеед", я бы хотел, чтобы он соответствовал этому документу. И такие запросы, как "Художник по имени Бибер Джастин - канадец" или "Имя Джастина так часто встречается" не должны найти соответствия.
Я вижу, что использование обработчика запроса "/select" по умолчанию не находит совпадения, когда я выдаю запрос "Джастин Бибер", даже если это точное совпадение. Но другое поле было установлено в качестве поля по умолчанию для "/select" относительной влажности, поэтому я попытался создать другую относительную влажность с помощью приведенного ниже завитка:
curl http://localhost/solr/performer/config -H 'Content-type:application/json' -d '{"add-requesthandler" : {"name": "/exactName","class":"solr.SearchHandler","defaults":{ "echoParams":"explicit" ,"rows":10, "df":"exactName_noAlias_en_US", "q.op":"AND" },"useParams":"x"}}'
Он создал RH, который я хотел, но мой запрос все еще не соответствовал требуемому документу.
Пожалуйста, предложите решение этой проблемы.
Вот скриншот с экрана анализа.
Ниже приведен фрагмент раздела "отладка" ответа на запрос: "/ точное имя? Q = точное имя_имя_Алиас_en_US: Джастин%20Bieber&wt=json&indent=true&debug=true"
"debug":{
"rawquerystring":"exactName_noAlias_en_US:Justin Bieber",
"querystring":"exactName_noAlias_en_US:Justin Bieber",
"parsedquery":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber",
"parsedquery_toString":"+exactName_noAlias_en_US:justin +exactName_noAlias_en_US:bieber",
"explain":{},
А ниже приведен фрагмент раздела "отладка" ответа на запрос: "/select? Q = точное имя_имя_Алиас_en_US: Джастин%20Bieber&wt=json&indent=true&debug=true"
"debug":{
"rawquerystring":"exactName_noAlias_en_US:Justin Bieber",
"querystring":"exactName_noAlias_en_US:Justin Bieber",
"parsedquery":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber",
"parsedquery_toString":"+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber",
"explain":{},
А ниже приведен фрагмент раздела "отладка" ответа на запрос фразы с /select RH: "/select? Q = точное имя_имя_узла_RU:" Джастин%20Bieber"&wt=json&indent=true&debug=true
"debug":{
"rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"querystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")",
"parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"",
"explain":{},
А ниже приведен фрагмент раздела "отладка" ответа для запроса фразы с / точным именем RH: "/ точное имя? Q = точный-имя-имени-а_и_US:" Джастин%20Bieber"&wt=json&indent=true&debug=true
"debug":{
"rawquerystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"querystring":"exactName_noAlias_en_US:\"Justin Bieber\"",
"parsedquery":"MultiPhraseQuery(exactName_noAlias_en_US:\"(justin justin bieber) bieber\")",
"parsedquery_toString":"exactName_noAlias_en_US:\"(justin justin bieber) bieber\"",
"explain":{},
Ниже приведен запрос и соответствующий раздел отладки с пробелами в запросе:
select?q=Justin\ Beiber&df=exactName_noAlias_en_US
Debug:
"rawquerystring":"Justin\\ Beiber",
"querystring":"Justin\\ Beiber",
"parsedquery":"+((exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber)/no_coord) +exactName_noAlias_en_US:beiber",
"parsedquery_toString":"+(exactName_noAlias_en_US:justin exactName_noAlias_en_US:justin beiber) +exactName_noAlias_en_US:beiber",
"explain":{},
2 ответа
Чтобы использовать дранку, вы должны запретить парсеру анализировать запрос и применить оператор по умолчанию, где есть место. Это может быть сделано путем выхода из космоса. Возможные запросы:
- q = точный_имя_Алиас_US:(Джастин \ Бибер)
- q = Джастин \ Бибер &df= correctName_noAlias_en_US
- q = Джастин \ Бибер (если в вашем обработчике определен df)
Несколько дополнительных заметок:
- there is discrepancy within field naming - in your config you define field 'exactMatch', you define default field 'exactName' and you query 'exactName_noAlias_en_US'
- you don't need new query handler to override df - you can provide that in your query
- you don't need df if you explicitly provide field name
Отладочная информация parsedquery для последней записи показывает, что вы ищете в двух разных полях - одно - это поле, которое вы указали, другое - поле поиска по умолчанию, которое вы установили ранее. Поскольку ни у одного из них нет токена с содержимым, которое вы ищете в каждом поле, вы не получите хита. Это также является причиной того, что ваш анализ показывает попадание, но вы не получаете попадания при поиске - фактический запрос не совпадает с тем, который вы указали для страницы анализа.
+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber"
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
Первая запись показывает, что вы ищете два токена, а затем запрашиваете пересечение этих двух наборов документов - поскольку ни один из них не содержит этот единственный токен, вы не получите попадания.
В поисках exactName_noAlias_en_US:"Justin Bieber"
может дать вам ответ, который вы ищете.