Solr подстановочный запрос с пробелами

У меня есть шаблонный запрос, который выглядит примерно так:

q=location:los a*

Я хотел бы, чтобы это соответствовало "Лос-Анджелесу" и "Лос-Альтосу". Запрос как:

q=los*

Работает просто отлично, но как только я добавляю пробелы, я не получаю результатов. Как я могу использовать пробелы в моих подстановочных запросах?

8 ответов

Я недавно столкнулся с этой проблемой сам, и кажется, что все, что вам нужно сделать, это избежать пробела в вашем запросе. Ваш исходный запрос будет интерпретирован Solr примерно так:

location:los id:a*

(при условии, что "id" является вашим полем поиска по умолчанию)

Однако, если бы вы написали свой запрос как:

location:los\ a*

Тогда это в конечном итоге будет проанализировано как:

location:los a*

И вышеупомянутое должно дать желаемые результаты (при условии, что ваши данные правильно проиндексированы).

Совет: понять все это просто. Просто добавь &debugQuery=on до конца URL, который вы используете при отправке запроса, чтобы увидеть, как он был проанализирован Solr.

Решение вашей проблемы с использованием сложного парсера запросов:

q={!complexphrase inOrder=true}location:"los a*"

Чтобы узнать больше о Парсере сложных фраз, перейдите по этой ссылке! https://cwiki.apache.org/confluence/display/solr/Other+Parsers

Могу ли я предложить плагин запроса префикса solr, если вы используете его только для подстановочных знаков в суффиксе, как мы http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin.html

пример использования

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi

будет соответствовать "Боб Смит" или "Боб Смит", но не преобразуется в проверку ("Боб" ИЛИ "Smi*"), как это произошло бы, если бы вы использовали первое решение, которое вы могли бы рассмотреть в соответствии с q=name:Bob%20Smi*

Надеюсь, это поможет вам или кому-то еще, ищущему простое решение, потому что я часами бился головой о стену, прежде чем нашел это!

У меня сработало

<fieldtype name="text_like" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    </analyzer>
</fieldtype>

и запрос field:*some\ phrase* (в Java-литерале нужно убежать \ как \\).

Не видя ваш конфиг, я бы сказал, используйте KeywordTokenizerFactory, так как вы, вероятно, токенизируете пустое пространство сейчас.

Использовал это

q=location:los/ a*

вместо того

q=location:los a*

У меня была такая же проблема в моем проекте. Когда я когда-либо искал слово вместе с пробелами, я не получал результат. Поэтому я заменил пробел на дефис "-" при индексации и запросах. Ниже приведен фрагмент schema.xml, который я использовал для этого:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
 <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
</fieldType>

Я думаю, что вы должны использовать конфиг, как это

  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement=""   replace="all" />
    </analyzer>
  </fieldType>

и вы должны обработать введенное ключевое слово для поиска как удалить пробелы

Запрос (при условии, что у вас есть пробел-пробел): q=location:los a* означает, что вы ищете документ со словом "los" и словом, начинающимся с "a"

Solr (насколько я знаю) не может определить, стоит ли одно слово (или термин) перед другим.

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