У меня возникли некоторые проблемы с поиском терминов с более чем одним дефисом / тире / минусом в индексе.Первоначально у меня был документ под названием «документ с двумя дефисами» в индексе, который можно найти с помощью запроса "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](https://i.stack.imgur.com/ptIVT.png)
Схема для типа выглядит следующим образом:
<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}&&[^\-_]]" 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}&&[^\-_\?\*]]" 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>