Поддержка как анализа EdegeNGram, так и поиска фраз в Solr 3.4.0

Я хочу включить поиск «startsWith» для каждого термина в запросе 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 подсветка больше не работает должным образом.


person mihaela    schedule 19.01.2012    source источник
comment
Может помочь, если вы разместите свой schema.xml, чтобы мы могли видеть, что вы делаете.   -  person Okke Klein    schedule 19.01.2012


Ответы (3)


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

введите здесь описание изображения

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

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

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

person Grimmo    schedule 07.02.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 выше.

person Max Schmidt    schedule 09.02.2012

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

person Persimmonium    schedule 02.06.2012