Я застрял с проблемой, описанной здесь. У меня есть текстовое поле, в котором хранится информация о кровати и ванне, при индексировании я сохраняю такие значения, как 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 ванных комнат», в то же время «6 кроватей 6 ванн» получает меня правильно полученные результаты. Вот URL-адрес с параметрами, которые я передал в solr для этого запроса.
/solr/select?q=6b+6ba&wt=xml&indent=true&q.op=AND
Я проверил интерфейс анализа администратора Solr для каждого из этих случаев и не нашел вообще никакой разницы. Поскольку этап анализа дает одинаковые результаты, я ожидал, что оба эти запроса будут работать одинаково. Может ли кто-нибудь указать мне, почему эти два запроса не ведут себя одинаково?
Это то, что я вижу в интерфейсе анализа администратора solr для двух рассматриваемых запросов.
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 кровати 3 ванны Фресно
/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