Моя схема:
<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>
Комбинации, которые я хочу работать:
"Walmart", "WalMart", "Wal Mart", "Wal-Mart", "Wal-mart"
Учитывая любую из этих строк, я хочу найти другую.
Таким образом, существует 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"
Снимок экрана анализатора:
Я пробовал различные комбинации фильтров, пытаясь разрешить эти ограничения, поэтому я наткнулся на решение, предоставленное по адресу: Solr - нечувствительный к регистру поиск не работает p >
В то время как кажется, что преодолевает одно из ограничений, которые у меня есть (см. № 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
содержится в токенах запроса и индекса. -
Проблема, о которой я упоминал здесь, - это всего лишь один случай использования. Есть несколько более сложные, такие как:
Слова с апострофами: "Mc Donalds", "Mc Donald's", "McDonald's", "Mc donalds", "Mc Donald's", "Mcdonald's"
Слова с различными пунктуациями: "Mc-Donald Engineering Company, Inc."
В общем, что лучший способ для моделирования схемы с таким требованием? NGrams? Индексируйте те же данные в разных полях (в разных форматах) и используйте директиву copyField (https://wiki.apache.org/solr/SchemaXml#Indexing_same_data_in_multiple_fields)? Каковы последствия этого для производительности?
EDIT: Оператором по умолчанию в моей схеме Solr является AND. Я не могу изменить его на OR.