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 (насколько я знаю) не может определить, стоит ли одно слово (или термин) перед другим.