Запрос 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>
Другие вопросы по тегам