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

20

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

<code>q=location:los a*
</code>

Мне бы хотелось, чтобы он совпадал с "los angeles" и "Los Altos". Запрос как:

<code>q=los*
</code>

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

Может быть, это невозможно, запросы с префиксными фразами не допускаются:link tbaz

Ваш Ответ

8   ответов
0

  <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>

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

0

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

<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-литерале нужно убежать \ как \\).

0

У меня была такая же проблема в моем проекте. Когда я когда-либо искал слово вместе с пробелами, я не получал результат. Поэтому я заменил пробел на дефис "-" при индексации и запросах. Ниже приведен фрагмент 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>
0

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

Error: User Rate Limit Exceeded tbaz
0

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

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

2

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

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

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

Error: User Rate Limit Exceeded
31

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

location:los id:a*

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

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

location:los\ a*

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

location:los a*

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

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

Error: User Rate Limit Exceededstackoverflow.com/questions/2630879/solr-exact-word-searchError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

если вы используете его только для подстановочных знаков в суффиксе, как мы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*

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

Похожие вопросы