2016-09-08 11 views
0

Я использую Solr 5.5, и у меня есть проблема, что я надеюсь найти решение здесь.solr shingle query matching keyword tokenized field

У меня есть поле, которое я создал, используя следующую настройку:

<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' не находит совпадения, когда я выдаю запрос «Justin Bieber», хотя это точное совпадение. Но другое поле было установлено в поле по умолчанию для «/ выберите» RH, поэтому я попытался создать другой RH, используя приведенный ниже завиток:

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 Я хотел, но мой запрос еще Ждет» t соответствует требуемому документу.

Просьба предложить решение этой проблемы.

Here is a screenshot from the Analysis screen.

Ниже приведен фрагмент раздела 'отладка' ответ на запрос: "/ exactName д = exactName_noAlias_en_US:? Джастин% 20Bieber & мас = JSON & отступ = истина & отладки = истинный"

"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":{}, 

И ниже фрагмент кода из раздела «отладки» ответа на запрос: «/ выберите д = exactName_noAlias_en_US: Justin% 20Bieber & вес = & отступа JSON = верно & отлаживать = истина»

"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":{}, 

И ниже фрагмент кода из раздела 'отладки' ответа на фразу запроса с/выберите RH: "?/Выберите д = exactName_noAlias_en_US:" Justin% 20Bieber»& вес = JSON & отступа = правда & отлаживать = истина

"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":{}, 

И ниже фрагмент кода из раздела «отладки» ответа на фразу запроса с/exactName RH: «/ exactName д = exactName_noAlias_en_US:» Джастин% 20Bieber»& вес = 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":{}, 
+0

Вы просмотрели вывод на странице «Анализ» под страницей администратора? Это позволит вам вводить как проиндексированный контент, так и запрос, и видеть, какие маркеры сгенерированы с обеих сторон, и получаете ли вы их с обеих сторон. Для отладки поставки поля по умолчанию или полей запроса в URL-адресах обычно проще, чем изменение или добавление обработчиков запросов. – MatsLindh

+0

Да, я сделал. Я вижу именно то, что хотел в этом инструменте. Но я не вижу такого же поведения, когда я отправляю запрос через http с помощью/select RH или пользовательского «/ exactName», о котором я упоминал выше. – oveflown

+0

Не могли бы вы включить вывод на этапе анализа? Также помните, что любые изменения в индексной части анализатора потребуют переиндексации этого документа. – MatsLindh

ответ

0

Информация parsedquery для отладки последней записи показывает, что вы выполняете поиск в двух разных полях - одно поле, которое вы предоставили, другое поле поиска по умолчанию, которое вы установили ранее.Поскольку ни один из них не имеет одного токена с содержимым, которое вы ищете в каждом поле, вы не получаете удар. Это также является причиной того, что ваш анализ показывает хит, но вы не получаете удар при поиске - фактический запрос отличается от того, который вы указали для страницы анализа.

+exactName_noAlias_en_US:justin +searchKeywords_en_US:bieber" 
^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^ 

Первая запись показывает, что вы ищете два маркера, то запрашивающий пересечение этих двух наборов документов, - как ни содержит этот единственный маркер, вы не получите удар.

Поиск exactName_noAlias_en_US:"Justin Bieber" может дать вам ответ, который вы ищете.

+0

Я пробовал, но все равно не повезло. Я включил раздел отладки такого запроса в исходное сообщение. – oveflown

0

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

  • д = exactName_noAlias_en_US: (Justin \ Bieber)
  • д = Justin \ Bieber & ДФ = exactName_noAlias_en_US
  • д = Justin \ Bieber (если DF определены в обработчике)

Несколько дополнительные примечания:

  • существует расхождение в фи eld naming - в вашей конфигурации вы определяете поле «exactMatch», вы определяете поле «точное имя» по умолчанию и вы запрашиваете «exactName_noAlias_en_US»
  • вам не нужен новый обработчик запросов для переопределения df - вы можете указать, что в вашем запросе
  • вам не нужно df, если вы явно указываете имя поля
+0

Спасибо @earnau за ваш ответ. Боюсь, он все еще не работает так, как я ожидаю. Я включаю часть отладки и запрос в исходное сообщение. – oveflown

+0

Добавление «q.op = OR» в запрос выполнило трюк. Спасибо @earnau – oveflown

+0

Да - ИЛИ является оператором по умолчанию, поэтому забыл упомянуть, что он должен быть настроен для работы. – earnau

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

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