Solr NGramTokenizerFactory и PatternReplaceCharFilterFactory - результаты анализатора несовместимы с результатами запроса - PullRequest
1 голос
/ 23 июня 2011

В настоящее время я использую то, что (по ошибке) я думаю, было бы довольно простой реализацией Solr NGramTokenizerFactory, но я получаю странные результаты, которые не согласуются между анализатором администратора и фактическими результатами запросов, и я надеюсь на некоторое руководство.

Я пытаюсь получить пользовательские данные, соответствующие моему индексу NGram (minGramSize = 2, maxGramSize = 2). Моя схема для индексации и времени запроса ниже, в котором

  1. Я удаляю все не алфавитно-цифровые символы, используя PatternReplaceCharFilter.
  2. Я токенизирую с NGramTokenizerFactory.
  3. Я строчные буквы, используя 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>

1 Ответ

0 голосов
/ 08 июля 2011

Итак, что-то странное, если PatternReplaceCharFilter не удаляет дефисы во время запроса. В конечном счете, я только что выполнил некоторую предварительную обработку в php пользовательского ввода с preg_replace перед отправкой в ​​Solr, и - альт! - работал как шарм с ожидаемыми результатами. Недоумение, что PatternReplaceCharFilter не ведет себя ...

Вот код php перед запросом, который я использовал, чтобы избавиться от тире, если кому-то это нужно.

$pattern = '/([-])/';
$replacement = ' ';
$usrpar = preg_replace($pattern, $replacement, $raw_user_search_contents);
$res = htmlentities($usrpar, ENT_QUOTES, 'utf-8');

После этого я только что передал $ res Солру ...

...