Термины, разделенные дефисами, не всегда найдены Solr - PullRequest
1 голос
/ 02 июля 2019

У меня возникли некоторые проблемы с поиском терминов с более чем одним дефисом / тире / минусом в индексе.Первоначально у меня был документ под названием «документ с двумя дефисами» в индексе, который можно найти с помощью запроса "document-with two-hyphens", но не с помощью "a document-with two-hyphens".

. Я упростил задачу, перечислив пофразу «abcdef» и ставить тире между каждой из букв, то есть

  • abcd ef
  • abc de f
  • abc def
  • ab cdef
  • и т. д. ...

Теоретически поиск любого из приведенных выше терминов должен возвращать все 32 элемента в индексе (например, поиск "a b c d e f").Однако 16 из вышеперечисленных не могут найти некоторое подмножество.

Например, поиск по "a b c d-e f" не может найти их:

  • a bc de f
  • ab c de f
  • abc de f
  • abc de f

(т.е. все термины с " d-e " в них, включая условие запроса )

При увеличении числа запросов до 2 можно найти все результаты, но это больше похоже на хак;Solr должен, по крайней мере, найти тот же элемент в индексе, что и запрос, так как они идентифицированы одинаково (см. Ниже).

Может кто-нибудь объяснить это поведение или как его можно «исправить»?

У нас такое же поведение для обычного запроса, dismax или edismax.Разобранный запрос:

"+DisjunctionMaxQuery((spanNear([title_de-de:a, title_de-de:b, title_de-de:c, spanOr([title_de-de:d-e, spanNear([title_de-de:d, title_de-de:e], 0, true)]), title_de-de:f], 0, true)))"

Анализ индекса / запроса выглядит следующим образом:

Solr analysis of

Схема для типа выглядит следующим образом:

<fieldType name="text_default" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true" multiValued="false" omitNorms="true">
    <analyzer type="index">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_]]" replacement=" "/>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterGraphFilterFactory"
                generateWordParts="1" generateNumberParts="1" catenateWords="0"
                catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                splitOnNumerics="0" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
    <analyzer type="query">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_\?\*]]" replacement=" "/>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterGraphFilterFactory"
                generateWordParts="1" generateNumberParts="1" catenateWords="0"
                catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                splitOnNumerics="0" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>

1 Ответ

0 голосов
/ 02 июля 2019

Вам не хватает индекса времени фильтра Flatten Graph .

WordDelimiterGraphFilter

Этот фильтр разбивает токены на разделители слов.

Если вы используете этот фильтр во время индексации, вы должны использовать фильтр плоских графиков для сжатия токенов друг над другом, таких как фильтр разделителей слов, потому что индексатор не может напрямую использовать график. Чтобы получить полностью корректные позиционные запросы при разделении токенов, вместо этого следует использовать этот фильтр во время запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...