Запрос 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 ванных комнат», в то же время «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

person Suresh    schedule 13.03.2013    source источник
comment
не могли бы вы разбить этот вопрос на: это мой вклад, это то, что я ожидаю в качестве результата?   -  person Lodewijk Bogaards    schedule 14.03.2013
comment
@mrhobo - я отредактировал исходный вопрос, добавив раздел Примеры входных и выходных данных.   -  person Suresh    schedule 14.03.2013
comment
Я связал ваши регулярные выражения, как это делает Solr. Результат совпадает с вашим ожидаемым результатом. regex101.com/r/bB8rR7 -› вывод вводится для -› regex101.com/r/uU2iO8. Мой вывод состоит в том, что связанные регулярные выражения не вызывают ваших проблем.   -  person Lodewijk Bogaards    schedule 14.03.2013


Ответы (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>
person Suresh    schedule 14.03.2013