Подтвердить что ты не робот

Запрос шаблона Solr с пробелами

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

q=location:los a*

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

q=los*

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

4b9b3361

Ответ 1

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

location:los id:a*

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

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

location:los\ a*

Затем он будет разбираться как:

location:los a*

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

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

Ответ 3

Могу я предложить плагин запроса префикса 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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Для меня работала

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

и query field:*some\ phrase* (в java-литерале нужно убежать \as \\).

Ответ 8

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