Как получить предложения в Solr 5.3.0

Я пытаюсь реализовать функцию автозаполнения с помощью Solr 5.3.0.

solrconfig.xml выглядит так

<searchComponent name="suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">default</str>
    <str name="lookupImpl">FuzzyLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">suggest_ngram</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">text_suggest_ngram</str>
    <str name="buildOnStartup">true</str>
  </lst>
</searchComponent>

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" >
<lst name="defaults">
  <str name="suggest">true</str>
  <str name="suggest.count">10</str>
</lst>
<arr name="components">
  <str>suggest</str>
</arr>

managed-schema looks like this:

<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" maxGramSize="10" minGramSize="2" />
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>


<field name="suggest_ngram" type="text_suggest_ngram" indexed="true" stored="false"/>
<field name="name" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="price" type="tlong" multiValued="false" indexed="true" stored="true"/>
<copyField source="name" dest="suggest_ngram"/>

Теперь, когда я использую анализатор из админки Solr, я вижу проиндексированные ngrams. И это удачно указывает на совпадение.

Однако, когда я использую запрос:

http://localhost:8983/solr/products/suggest?suggest=true&suggest.build=true&wt=json&suggest.q=Jind

Я получаю 0 предложений. Ответ находится здесь: https://api.myjson.com/bins/47r3i

В одном из документов существует значение «Jindal Panther» для ключа имени.

Более того, я обнаружил, что если я создам фиктивное поле копирования «предложить» с типом «String» с источником в виде «имени», любое предложение, которое отлично работает с «именем», не будет работать с «предложением». Может ли это быть неправильной настройкой поля копирования для включения предложений?

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

РЕДАКТИРОВАТЬ: Получил решение. См. принятый ответ и его комментарии ниже. Я наткнулся на блог, который прекрасно объясняет Suggesters. Это определенно стоит прочитать новичку в Solr Search.

https://lucidworks.com/blog/2015/03/04/solr-suggester/


person Nikhil Sahu    schedule 30.09.2015    source источник


Ответы (1)


Поле, в котором вы хотите настроить подсказку, должно быть store=true. Его не нужно индексировать. Конфигурация подсказки создаст словарь в соответствии с конфигурацией предоставления в файле suggestComponet. Поле name сохранено как true, а suggest_ngram — нет. Вам необходимо обновить конфигурацию схемы следующим образом:

<field name="suggest_ngram" type="text_suggest_ngram" indexed="false" stored="true"/>

Также вам необходимо указать параметр suggest.dictionary, словарь, который вы используете для предложений. Для вас это имена как default.

http://localhost:8983/solr/products/suggest?suggest=true&
       suggest.build=true&
       wt=json&
       suggest.dictionary=default&
       suggest.q=Jind

ИЛИ вы можете предоставить конфигурацию словаря в requestHandler из /suggest:

<str name="suggest.dictionary">default</str>
person YoungHobbit    schedule 30.09.2015
comment
Теперь я могу получить предложения с самого начала значения. Но я также хочу включить предложения от слова, присутствующего в середине. Но запрос: http://localhost:8983/solr/products/suggest?suggest=true&suggest.build=true&wt=json&suggest.q=Pan не дает никаких результатов. - person Nikhil Sahu; 08.10.2015
comment
какую текущую реализацию lookupImpl вы используете? - person YoungHobbit; 08.10.2015
comment
FuzzyLookupFactory Поскольку вышеупомянутая конфигурация не работала, я переключился на получение предложений из поля имени, а не из поля копирования, в котором включено n грамм. - person Nikhil Sahu; 08.10.2015
comment
AnalyzingInfixLookupFactory не могли бы вы попробовать с этим. Это предлагает совпадения на основе совпадений префикса с любыми токенами в проиндексированном тексте. Вам нужно перезагрузить ядро, не забывайте об этом - person YoungHobbit; 08.10.2015
comment
Это сделало это. Большое спасибо :) - person Nikhil Sahu; 08.10.2015
comment
Нельзя ли настроить два отдельных словаря на разные поля с помощью AnalyzingInfixLookupFactory? Он выдает исключение, когда я пытаюсь это сделать. msg=SolrCore 'products' is not available due to init failure: org.apache.lucene.store.LockObtainFailedException: Lock held by this virtual machine: /home/nikhil/Documents/solr-5.3.0/server/solr/products/data/analyzingInfixSuggesterIndexDir/write.lock - person Nikhil Sahu; 09.10.2015
comment
Получил это сейчас. Необходимо указать разные каталоги для хранения индексов. - person Nikhil Sahu; 09.10.2015
comment
@nikhil24 nikhil24 Да, используя параметр indexPath. - person YoungHobbit; 09.10.2015
comment
Могу ли я не возвращать другие данные (например, идентификатор документа и т. д.) вместе с предложением? Нужно ли мне реализовать предложение иначе, чем указано выше, чтобы сделать это? - person Nikhil Sahu; 13.10.2015
comment
@nikhil24 nikhil24 Вы можете отправить одно поле в теге полезной нагрузки, например <str name="payloadField">YourField</str> в определении searchComponent. - person YoungHobbit; 13.10.2015
comment
кажется, что ограничение касается одного поля. Мне придется найти другой способ реализовать предложения. - person Nikhil Sahu; 13.10.2015
comment
Я также сталкиваюсь с той же проблемой. Пожалуйста, прокомментируйте здесь, если вы найдете какое-либо решение. - person YoungHobbit; 13.10.2015
comment
@nikhil24 nikhil24 Вы видели мой пост о множественной полезной нагрузке solr. - person YoungHobbit; 13.10.2015
comment
Это: stackoverflow.com/questions/32434186/ ? Ага. - person Nikhil Sahu; 13.10.2015
comment
Давайте продолжим обсуждение в чате. - person YoungHobbit; 13.10.2015