Использование автозаполнения SOLR для нескольких терминов (то есть разделенных запятыми мест) - PullRequest
4 голосов
/ 03 января 2012

У меня запущен SOLR, он индексирует данные через DIH и правильно возвращает результаты для запросов.Я пытаюсь настроить другое ядро ​​для запуска подсказки, чтобы автозаполнение географических местоположений.У нас есть веб-приложение, которое должно принимать данные о городе, штате / регионе, стране.Мы хотели бы сделать это в одном окне ввода.Вот несколько примеров:

Бруклин, Нью-Йорк, Соединенные Штаты АмерикиФиладельфия, Пенсильвания, Соединенные Штаты АмерикиБарселона, Каталония, Испания

Предположим, что каждое место в мире можно разделить на эти 3 формы ввода.Я настроил свой DIH для создания поля TemplateTransformer, которое объединяет 4 таблицы (город, штат и страна - все независимые таблицы, соединенные друг с другом таблицей основных мест) в поле с именем "fullplacename":

<field column="fullplacename" template="${city_join.plainname},
${region_join.plainname}, ${country_join.plainname}"/>

Я определил поле "text_auto" в schema.xml:

<fieldType class="solr.TextField" name="text_auto">
    <analyzer>
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

и определил также эти два поля:

<field name="name_autocomplete" type="text_auto" indexed="true" stored="true" multiValued="true" />
<copyField source="fullplacename" dest="name_autocomplete" />

Теперь вот моя проблема.Это хорошо работает для первого термина, то есть, если я наберу "brooklyn", я получу ожидаемые результаты, используя этот URL для запроса:

http://localhost:8983/solr/places/suggest?q=brooklyn

Однако, как только я поставлю запятую и /или пробел там, он разбивает их на 2 предложения, и я получаю предложение для каждого:

http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny

Дает мне предложение для "Бруклин" и предложение для "Нью-Йорк" вместо предложенияэто соответствует "Бруклин, Нью-Йорк".Я испробовал все решения, которые смог найти через Google, и мне не повезло.Есть что-то простое, что я пропустил, или это неправильный подход?

Спасибо!

EDIT: На всякий случай вот определение searchComponent и requestHandler:

<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <str name="spellcheck.count">10</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
    </arr>
</requestHandler>

<searchComponent name="suggest" class="solr.SpellCheckComponent">
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <str name="field">name_autocomplete</str>`<br/>
    </lst>
</searchComponent>

Ответы [ 3 ]

2 голосов
/ 03 января 2012

Проблема заключается в подсказчике.Как и проверка орфографии, которую он токенизирует на пустом месте.

http://lucene.472066.n3.nabble.com/suggester-issues-tp3262718p3266140.html имеет решение этой проблемы.

0 голосов
/ 27 ноября 2013

Мне кажется, что принятый ответ слишком сложен.Элегантный способ сделать это - использовать http://localhost:8983/solr/places/suggest?spellcheck.q=brooklyn вместо http://localhost:8983/solr/places/suggest?q=brooklyn.Как уже упоминалось здесь

0 голосов
/ 14 февраля 2013

Вы используете KeywordTokenizer, который не будет создавать отдельные токены для "Brooklyn", "NY" и "United States".

Ваши примеры запросов выглядят не так как автозаполнение, а скорее как обычные поиски.

Запрос автозаполнения (IMHO) содержит только частичные термины:

http://localhost:8983/solr/places/suggest?q=brook

для списков с опережением типа.Вы хотите использовать EdgeNGram для этого: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory Скорее всего, в сочетании с StandardTokenizer и / или WordDelimiterFilterFactory.

Для вашего примера запроса:

http://localhost:8983/solr/places/suggest?q=brooklyn%2C%20ny

StandardTokenizer в сочетании с LowercaseFilterи обработчик запросов dismax с хорошей конфигурацией параметра mm - ограничивающий попадания теми, которые содержат все входные термины - будет работать хорошо, см .: http://wiki.apache.org/solr/DisMaxQParserPlugin#mm_.28Minimum_.27Should.27_Match.29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...