поиск по фразе solr dismax - PullRequest
2 голосов
/ 20 октября 2011

Я создаю приложение, которое использует solr для сопоставления более длинных запросов (как правило, полных предложений) с индексированными документами, которые почти всегда короче (условия поиска).Таким образом, мой запрос выглядит так: «Должен ли я купить дом сейчас, когда ставки низкие. Мы подали заявку 2 года назад. Арендуйте сейчас, с некоторыми долгами по кредиту», а мои проиндексированные документы похожи на «купить дом», «дом».ставки кредитования ".

Я подумал, что правильный способ сделать это - использовать дранку, анализатор dismax и сильно увеличенное поле" pf ".Итак, у меня есть «нормальное» текстовое поле, kw_stopped (text_en в solr 3.4) с очень агрессивным списком стоп-слов, и поле kw_phrases, которое должно быть словосочетанием фразы.Его определение выглядит следующим образом:

<fieldType name="shingle" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
    catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1"
    catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.ShingleFilterFactory" maxShingleSize="8" outputUnigrams="false"/>
  </analyzer>
</fieldType>

и мои поля схемы выглядят так:

<field name="kw_stopped" type="text_en" indexed="true" omitNorms="True" />
<!-- keywords almost as is - to provide truer match for full phrases -->
<field name="kw_phrases" type="shingle" indexed="true" omitNorms="True" />

Моя конфигурация обработчика поиска выглядит следующим образом:

<requestHandler name="edismax" class="solr.SearchHandler" default="true">
  <lst name="defaults">
  <str name="defType">edismax</str>
  <str name="echoParams">explicit</str>
  <float name="tie">0.1</float>
  <str name="fl">
    keywords
  </str>
  <str name="mm">1</str>
  <str name="qf">
    kw_stopped^1.0 kw_phrases^5.0
  </str>
  <str name="pf">
    kw_phrases^50.0
  </str>
  <int name="ps">3</int>
  <int name="qs">3</int>
  <str name="q.alt">*:*</str>
 </lst>
</requestHandler>

Когда явключив debugQuery, я замечаю, что kw_phrases никогда не соответствует, если запрос и документ не совпадают в точности.Также синтаксический анализ показывает, что каждый из токенизированных из запроса отображается как отдельные предложения DisjunctionMaxQuery для «kw_stopped», но все черепицы помещены в одно гигантское предложение для поля kw_phrases.?Как я могу сделать эту работу?

спасибо!Виджей

1 Ответ

4 голосов
/ 21 октября 2011

Если вы используете длинные предложения для поиска по более коротким документам, у вас, похоже, все в порядке.

  • Использование парсера запросов Edismax
  • Использование значения мм до очень низкого значения или 0% , так что поведение такое же, как ИЛИ, то есть любое из слов. Вы можете изменить его так, чтобы оно совпадало по крайней мере с 2 или 3 словами, чтобы предотвратить возвращение слов с совпадениями из одного слова.
  • Это позволит вам контролировать соответствие терминов в строке поиска для возврата документа.
  • Использование pf (поля фраз) для сопоставления документов выше, которые имеют точные совпадения.
  • Вместо явного фильтра гальки используйте поля pf2 и pf3 (поля гальванической фразы), чтобы сопоставить документы более высокого уровня, в которых гальваническое совпадение соответствует комбинации из двух или трех слов.
  • используйте значение ps (slop фразы), чтобы обеспечить адекватное значение slop для совпадений фраз.

Конечно, вам нужен хороший список фильтров стоп-слов, чтобы предотвратить совпадение общих терминов как во время индекса, так и во время поиска.

...