Solr Точная фильтрация совпадений - PullRequest
0 голосов
/ 05 сентября 2018

Я запускаю Solr 5.3.1, поле имя имеет тип_имя

<fieldType name="firstnametype" class="solr.TextField" omitNorms="true" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords-firstname.txt" enablePositionIncrements="true" />
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.ASCIIFoldingFilterFactory" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

Теперь я хочу запрашивать только записи, где имя - это «Джон Джепсон», «Джон Дж» или просто «Джон».

Я пытался добавить фильтр:

fq=(firstname:"John Jepson" OR firstname:"John J" OR firstname:"John")

Но записи результатов содержат «Джона Фрэнсиса», «Аврама Джона», «Фредериха Иоанна» и т. Д. В имя вместе с правильными записями.

Есть ли способ избавиться от этих неправильных записей без переиндексации?

1 Ответ

0 голосов
/ 05 сентября 2018

Нет, вам придется переиндексировать, и вам нужно будет создать тип поля, чтобы получить совпадения, которые вы хотите. Если вы только заинтересованы в точных совпадениях, чувствительны к регистру и всем, использование поля string подойдет (а затем используйте инструкцию copyField для копирования одного и того же содержимого в оба поля, так что вы не нужно изменять код индексации).

Если вы не хотите, чтобы в поиске учитывался регистр символов, используйте TextField с KeywordTokenizer и LowerCaseFilterFactory в качестве единственного фильтра в цепочке.

Причину, по которой вам придется переиндексировать, можно показать, если вы подумаете о индексировании John Jepson. Этот текст будет разбит на John и Jepson вашим токенайзером. Когда вы затем отправляете запрос только с John, Lucene будет искать любой документ, который имеет токен John. Так как ваша обработка на стороне индекса создала отдельный токен для John, он будет соответствовать всему, что имеет John где-то в своем имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...