Поиск по запросу

Я использую 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" может дать вам ответ, который вы ищете.

Другие вопросы по тегам