Запрос шаблона Solr с пробелами
У меня есть шаблонный запрос, который выглядит примерно так:
q=location:los a*
Мне бы хотелось, чтобы он соответствовал "los angeles" и "los altos". Запрос типа:
q=los*
Работает отлично, но как только я добавляю пробелы, я не получаю никаких результатов. Как я могу использовать пробелы в своих подстановочных запросах?
Ответы
Ответ 1
Недавно я столкнулся с этой проблемой, и кажется, что все, что вам нужно сделать, - это избежать пробела в вашем запросе. Ваш исходный запрос будет интерпретироваться Solr следующим образом:
location:los id:a*
(предполагая, что "id" - поле поиска по умолчанию)
Однако, если вы должны написать свой запрос как:
location:los\ a*
Затем он будет разбираться как:
location:los a*
И приведенное выше должно дать желаемые результаты (при условии, что ваши данные правильно проиндексированы).
Совет.. Все это просто. Просто добавьте &debugQuery=on
в конец URL-адреса, который вы используете при отправке запроса, чтобы посмотреть, как он был разобран Solr.
Ответ 2
Решение проблемы с использованием сложного анализатора запросов:
q={!complexphrase inOrder=true}location:"los a*"
Чтобы узнать больше о парсере сложных парсеров, ознакомьтесь с этой ссылкой!
https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser
Ответ 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>