Моя схема:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0"
splitOnCaseChange="1" splitOnNumerics="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English"
protected="protwords.txt"/>
</analyzer>
</fieldType>
Комбинации, с которыми я хочу работать:
"Уолмарт", "Уолмарт", "Уолмарт", "Уолмарт", "Уолмарт"
Учитывая любую из этих строк, я хочу найти другую.
Итак, таких комбинаций, как указано ниже, 25:
(Первый столбец обозначает вводимый текст для поиска, второй столбец обозначает ожидаемое совпадение)
(Walmart,Walmart)
(Walmart,WalMart)
(Walmart,Wal Mart)
(Walmart,Wal-Mart)
(Walmart,Wal-mart)
(WalMart,Walmart)
(WalMart,WalMart)
(WalMart,Wal Mart)
(WalMart,Wal-Mart)
(WalMart,Wal-mart)
(Wal Mart,Walmart)
(Wal Mart,WalMart)
(Wal Mart,Wal Mart)
(Wal Mart,Wal-Mart)
(Wal Mart,Wal-mart)
(Wal-Mart,Walmart)
(Wal-Mart,WalMart)
(Wal-Mart,Wal Mart)
(Wal-Mart,Wal-Mart)
(Wal-Mart,Wal-mart)
(Wal-mart,Walmart)
(Wal-mart,WalMart)
(Wal-mart,Wal Mart)
(Wal-mart,Wal-Mart)
(Wal-mart,Wal-mart)
Текущие ограничения с моей схемой:
1. "Wal-Mart" -> "Walmart",
2. "Wal Mart" -> "Walmart",
3. "Walmart" -> "Wal Mart",
4. "Wal-mart" -> "Walmart",
5. "WalMart" -> "Walmart"
Скрин анализатора:
Я пробовал различные комбинации фильтров, пытаясь устранить эти ограничения, поэтому я наткнулся на решение, представленное по адресу: -work">Solr - поиск без учета регистра не работает
Хотя кажется, что он преодолевает одно из моих ограничений (см. № 5 WalMart -> Walmart), в целом он хуже, чем то, что у меня было раньше. Теперь это не работает для таких случаев, как:
(Wal Mart,WalMart),
(Wal-Mart,WalMart),
(Wal-mart,WalMart),
(WalMart,Wal Mart)
besides cases 1 to 4 as mentioned above
Анализатор после изменения схемы:
Вопросы:
Почему «WalMart» не соответствует «Walmart» с моей исходной схемой? Анализатор Solr ясно показывает мне, что он произвел 3 токена во время индексации:
wal
,mart
,walmart
. Во время запроса: он создал 1 токен:walmart
(хотя неясно, почему он будет создавать только 1 токен), я не понимаю, почему он не соответствует, учитывая, чтоwalmart
содержится как в токенах запроса, так и в токенах индекса.- #P15# <блочная цитата> #P16# #P17# блочная цитата>
В общем, как лучше всего моделировать схему с такими требованиями? Nграммы? Индексируйте одни и те же данные в разных полях (в разных форматах) и используйте директиву copyField (https://wiki.apache.org/solr/SchemaXml#Indexing_same_data_in_multiple_fields) ? Каковы последствия этого для производительности?
РЕДАКТИРОВАТЬ: оператор по умолчанию в моей схеме Solr - AND. Я не могу изменить его на ИЛИ.