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