В настоящее время я использую то, что (по ошибке) я думаю, было бы довольно простой реализацией Solr NGramTokenizerFactory
, но я получаю странные результаты, которые не согласуются между анализатором администратора и фактическими результатами запросов, и я надеюсь на некоторое руководство.
Я пытаюсь получить пользовательские данные, соответствующие моему индексу NGram (minGramSize = 2, maxGramSize = 2). Моя схема для индексации и времени запроса ниже, в котором
- Я удаляю все не алфавитно-цифровые символы, используя
PatternReplaceCharFilter
.
- Я токенизирую с
NGramTokenizerFactory
.
- Я строчные буквы, используя
LowerCaseFilterFactory
(что оставляет не буквенные токены на месте, поэтому мои номера останутся).
Используя приведенную ниже схему, я бы подумал, что поиск "PCB-1260" (с правильно экранированным тире) должен соответствовать индексированному токену Ngram и нижнему регистру значения "Arochlor-1260" (т. Е. Биграммы для 1260 «12 26 60» как в индексированном значении, так и в запрашиваемом значении).
К сожалению, я не получаю результатов, если не удалю тире. [РЕДАКТИРОВАТЬ - даже когда я правильно выхожу из тире и оставляю его в запросе, я тоже не получаю результатов] Это кажется странным, потому что я делаю полную замену шаблона всех буквенно-цифровых символов, используя PatternReplaceCharFilter
- который, я полагаю, удаляет все пробелы и тире.
Анализатор запросов на странице администратора показывает правильное соответствие, используя схему ниже - так что я немного растерялся. Есть ли что-то фундаментальное в PatternReplaceCharFilter
или NGramTokenizerFactory
, которые мне здесь не хватает?
Я проверил код и другие посты, но не могу понять это. После недели, когда я бьюсь головой о стену, я подчиняю это руководству стека ...
<fieldtype name="tokentext" class="solr.TextField" positionincrementgap="100">
<analyzer type="index">
<charfilter class="solr.PatternReplaceCharFilterFactory" pattern="([^A-Za-z0-9])" replacement=""/>
<tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<charfilter class="solr.PatternReplaceCharFilterFactory" pattern="[^A-Za-z0-9]" replacement=""/>
<tokenizer class="solr.NGramTokenizerFactory" mingramsize="2" maxgramsize="2"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>