Поиск фразы Solr должен соответствовать частичному слову - PullRequest
1 голос
/ 23 мая 2019

Использование Solr для поиска документов на английском и корейском языках, пока что поиск на корейском языке работает нормально. Необходимо расширить английскую точную фразу, чтобы она соответствовала частичным словам.

Solr запрос, который я использовал:

content: "He go"

не соответствует Он идет, Он ушел, Он цель и т. Д.

Я пытался с этим, но не работал

content: "He go"*
content: "He go*"

Схема текущего поля

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.CJKBigramFilterFactory" han="false" hiragana="false" katakana="false" hangul="true" outputUnigrams="true" />
    </analyzer>
</fieldType>

Итак, мой ввод и ожидаемый вывод приведены ниже:

Вход: он идет (с цитатой)
Вывод: Он идет, он уходит, он цели (должен соответствовать документам с этими словами, может быть частичное совпадение)

Как я могу достичь этой функциональности, любое предложение высоко ценится.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Синтаксический анализатор запросов поддерживает встроенные символы подстановки во фразе.В вашем случае добавление inOrder=true к параметрам даст вам желаемое поведение.

Есть несколько ограничений, о которых вы должны знать:

Производительность чувствительна к числууникальных терминов, которые связаны с шаблоном.Например, поиск «a *» сформирует большое предложение OR (технически SpanOr со многими терминами) для всех терминов в вашем индексе для указанного поля, которые начинаются с одной буквы «a».Может быть целесообразным ограничить подстановочные знаки, по крайней мере, двумя или предпочтительно тремя буквами в качестве префикса.Разрешение очень коротких префиксов может привести к возвращению многих некачественных документов.

Обратите внимание, что он также поддерживает лидирующие подстановочные знаки "* a", что также сказывается на производительности.Применение ReversedWildcardFilterFactory в анализе индекса времени обычно является хорошей идеей.

1 голос
/ 23 мая 2019

Если вы хотите искать по частям слова, вам необходимо применить, например, N-Gram Tokenizer, <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>

например.

In: "bicycle"

Out: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"

В этом случае вы сможете осуществлять поиск по части слова.Вам необходимо применить NGramTokenizerFactory для обоих анализаторов:

<fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">
    <analyzer type="index">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

Если вы используете вышеупомянутый тип поля, тогда анализ того же самого на инструменте администрирования будет таким, как показано ниже.

Analysis of the solr admin tool

Вы также можете попробовать анализатор запросов ниже.Все зависит от ваших требований.

<analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>

Вы можете изменить или добавить типы полей в schema.xml и применить их к своему полю.После этого перезапустите сервер, переиндексируйте данные.Вы можете проверить вышеуказанный fieldType для своего поля, если данные совпадают с помощью инструмента администрирования solr.

Я использовал приведенный ниже тип поля и провел анализ с использованием инструмента solr.

Вот полеТип:

    <fieldType name="custome_field_type" class="solr.TextField" positionIncrementGap="100" multiValued="false">
        <analyzer type="index">
          <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="10"/>
          <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.KeywordTokenizerFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
   </fieldType>

Пожалуйста, найдите анализ того же из инструмента администрирования solr.

Solr Analysis Page

...