Solr поиски с апострофами работает только частично - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь выполнить поиск в поле, содержащем имена.Я пытаюсь понять, почему я не могу запрашивать имена с апострофами.Если я ищу «О», я получаю ожидаемые результаты (такие как О'Брайен, О'Фаррелл, О'Коннелл и т. Д.).Если я ищу имя «О'Брайен», я получаю ожидаемые результаты.Но если я ищу «O'B» или что-либо, кроме полного имени или просто «O», я не получаю результатов.К вашему сведению, в предыдущих примерах я не включаю двойные кавычки.В рассматриваемом поле используется следующий тип поля (пользовательский тип, созданный для обеспечения возможности поиска имен, заканчивающихся на y - без него я не могу найти «Ледяной»):

<fieldType name="trname" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
         enablePositionIncrements=true ensures that a 'gap' is left to
         allow for accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            format="wordset"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

Любая помощь в значительной степениоценил.

РЕДАКТИРОВАТЬ : Я только что заметил, что заголовок вопроса был совершенно неверным!

1 Ответ

0 голосов
/ 26 мая 2018

При запросе с использованием подстановочных знаков большая часть анализа не выполняется - это означает, что токены, по которым вы ищете, не совпадают с теми, которые вы запрашиваете.

WordDelimiterFilter будет разбивать токены на основе ', что означает, что при индексации контента вы будете получать отдельные токены для каждой части слова - то есть O и Brien.При поиске такое разделение не произойдет, и Lucene попытается сопоставить один токен - O'Brien с индексированными токенами.Поскольку токен не соответствует O'Brien (так как термин был разбит на несколько токенов при индексации), вы не получите попадание.

Решение состоит в том, чтобы создать поле, совпадающее с символами подстановки, которые вы ожидаетеиспользуйте - в этом случае, вероятно, поле только с WhitespaceTokenizer и LowercaseFilter (которое должно работать с подстановочными знаками, так как оно является multitemaware).

Ожидается использование нескольких различных полей с одинаковым содержимым, и вы можете использовать copyFieldчтобы убедиться, что один и тот же контент индексируется в несколько полей, а затем обрабатывается по-разному, в зависимости от того, как вы собираетесь их запрашивать.Таким образом, у вас может быть одно поле, по которому вы будете искать, когда вы ожидаете, что Brien будет совпадать с O'Brien, и то, которое вы можете использовать для поиска по шаблону, где это может быть не так.

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