Запрос Solr не работает для входных данных с пробелами, хотя вывод из фазы анализа, кажется, работает нормально
Я застрял с проблемой, как подробно изложено здесь. У меня есть текстовое поле, в котором хранится информация о кроватях и ваннах, в то время как при индексировании я сохраняю значения как 2b 3bt для 2 кроватей и 3 ванн соответственно. Наконец, мне нужно поддержать запросы, такие как "2 кровати 3 ванны", "кровати 2 3 ванны", "2 спальни комнаты 3 ванны", "2bd 3bth" ....
Для этого я использую текстовое поле с типом text_general, как показано ниже
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bed\s*rooms|bed\s*room|beds|bed|bdr|bd|br|b)|(bed\s*rooms|bed\s+room|beds|bed|bdr|bd|br|b)\s*(\d\.?\d{0,2}))" replacement="$2$5b" />
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(?i)((\d\.?\d{0,2})\s*(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)|(bath\s*rooms|bath\s*room|baths|bath|bth|bt|bh|ba)\s*(\d\.?\d{0,2}))" replacement="$2$5bt" />
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.TrimFilterFactory" updateOffsets="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Я пробовал запросы Solr с интерфейсом администратора, и он почти нормально работает для всех комбинаций, за исключением случая с промежуточными пробелами, такими как "6 спальных мест, 6 ванных комнат" или "6 спальных комнат, 6 ванных комнат". Результаты. Вот URL с параметрами, которые я поместил, чтобы решить для этого запроса
/solr/select?q=6b+6ba&wt=xml&indent=true&q.op=AND
Я проверил интерфейс административного анализа Solr для каждого из этих случаев и не обнаружил никакой разницы. Поскольку фаза анализа дает одинаковые результаты, я ожидал, что оба этих запроса будут работать одинаково. Кто-нибудь может направить меня, почему эти два запроса не ведут себя одинаково?
Это то, что я вижу в интерфейсе анализа solr admin для этих двух запросов
For input : 6 beds 6 bath room,
PRCF 6b 6bath room
PRCF 6b 6bt
ST 6b | 6bt
TF 6b | 6bt
SF 6b | 6bt
LCF 6b | 6bt
For input : 6b 6bt
PRCF 6b 6bt
PRCF 6b 6bt
ST 6b | 6bt
TF 6b | 6bt
SF 6b | 6bt
LCF 6b | 6bt
Образцы входов и выходов - Вот несколько примеров входов, которые я попытался использовать с помощью определения поля, которое я уже упоминал выше, Примечание: (#) - это просто серийный номер и не является частью ввода
(1) 2beds 3baths Fresno
(2) 3baths 2beds Fresno
(3) Fresno 2bedroom 3bathroom
(4) beds2 3baths Fresno
(5) beds2 bathrooms3 Fresno
Все вышеперечисленное работает отлично даже сейчас, вот некоторые входные данные, которые по-прежнему меня беспокоят из-за текущего определения поля
(6) 2 beds 3 baths Fresno
(7) 2 bed rooms 3 baths Fresno
(8) Fresno 2 bed room 3 baths
(9) Fresno 3baths 2 bed rooms
Выходные данные, которые я ожидаю для вышеупомянутых входных данных после фазы анализа в том же порядке серийных номеров, как показано ниже (например, при индексации для 2 ванн 3 ванны, я индексирую данные как 2b 3bt)
(1) 2b 3bt Fresno
(2) 3bt 2b Fresno
(3) Fresno 2b 3bt
(4) 2b 3bt Fresno
(5) 2b 3bt Fresno
(6) 2b 3bt Fresno
(7) 2b 3bt Fresno
(8) Fresno 2b 3bt
(9) Fresno 3bt 2b
Но до этого момента, я думаю, у меня все хорошо, поскольку я могу генерировать точно такой же результат анализа, который я подтвердил через интерфейс анализа Solr-администратора. Настоящая проблема здесь заключается в том, что я могу получить запрос для получения правильных результатов поиска для первый раздел ввода (то есть) до #5, но для входов от #6 до #9 я не получаю никаких результатов
Это типовой формат запроса, который я пытаюсь ввести #1, т.е. 2 beds 3 baths Фресно
/solr/collection1/select?q=2beds+3baths+Fresno&wt=xml&indent=true&q.op=AND
И этот для № 6, т.е.) 2 кровати 3 ванны Фресно
/solr/collection1/select?q=2+beds+3+baths+Atlanta&wt=xml&indent=true&q.op=AND
1 ответ
Окончательное решение, которое я применил здесь, как показано ниже,
Я удалил PatternReplaceCharFilterFactory для постели и ванны из анализатора времени запроса и выполнил аналогичную замену шаблона для входного текста из моего сервлета.
Так что теперь для следующего ввода текста
2 beds 3 baths Fresno
Из моего кода сервлета я конвертирую его в
2b 3bt Fresno
Это то, что я потом передаю в solr для работы... и теперь он работает нормально
Вот модифицированное определение типа поля для поля text_general:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.TrimFilterFactory" updateOffsets="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>