Поддержка как анализа EdegeNGram, так и поиска фраз в Solr 3.4.0 - PullRequest
2 голосов
/ 19 января 2012

Я хочу разрешить поиск «старт с» для каждого термина в запросе SOLR, но также иметь возможность выполнять поиск по фразе (указан в кавычках). Для поиска префикса сначала я добавил суффикс "*". Это решение позволяет выполнять поиск по префиксу и по фразе, но мне не нравится это решение, потому что это поиск по шаблону, а поиск по шаблону не анализирует термины.

Поэтому я включил EdgeNgramFilterFactory только при индексировании. Поиск по префиксу работает нормально, но точный поиск по фразе больше не работает.

Кто-нибудь знает, как включить поиск по фразе, даже если включена EdgeNgram?

Спасибо!

Вот схема.xml

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="back" />
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="50" side="front" />
        <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.PorterStemFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
        <filter class="solr.PorterStemFilterFactory"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
      </analyzer>
    </fieldType>

Также я заметил, что при использовании WordDelimiterFilterFactory подсветка перестает работать хорошо.

Ответы [ 3 ]

5 голосов
/ 07 февраля 2012

Поиск по фразе не работает, потому что EdgeNGram создает дополнительные термины и увеличивает позицию термина (что удивительно) для каждого фрагмента слова. Предполагается, что фразы будут точными, то есть расстояние (наклон) между двумя последовательными членами равно 1. Но с кусками индексированный текст выглядит иначе. Представьте, что вы проиндексировали текст "Hello World", используя <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" side="front"/>. Тогда индексированный текст будет выглядеть так: «он, черт возьми, привет, во всем мире!». Вы найдете фразу «hel hell», а не «hello world».

enter image description here

Как вариант, вы можете разрешить некоторое расстояние между словами, увеличив qs параметр анализатора запросов ( dismax ).

Но поиск «не точной фразы» может быть неприемлемым, так как вы найдете дополнительные неожиданные фразы, такие как «hel hell».

Лучшим вариантом будет использовать отдельное поле для нграмм . В этом случае текст будет проиндексирован в двух полях, и нграммы не будут нарушать исходный текст.

2 голосов
/ 09 февраля 2012

Вы можете использовать два поля - одно для поиска префиксов и суффиксов, а другое - для точного соответствия.

  <field indexed="true" name="myfield_edgy"        type="edgy"/>
  <field indexed="true" name="myfield_exactmatch"  type="exactmatch"/>
  <copyField source="myfield_exactmatch" dest="myfield_edgy"/>

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

0 голосов
/ 02 июня 2012

Еще одним вариантом является обновление до 3.6.0, поскольку теперь подстановочные знаки не препятствуют анализу запроса

...