Solr Запросы с тире - PullRequest
       25

Solr Запросы с тире

0 голосов
/ 27 ноября 2018

В настоящее время я использую Solr Edismax для поиска на нашем сайте.То, что я пытаюсь сделать, это, по сути, игнорировать тире.

Так что, если я буду искать слова, "wi-fi adapter".И у меня есть документ с заголовком "адаптер Wi-Fi".Я не получу никаких результатов.

В настоящее время я использую solr.MappingCharFilterFactory для сопоставления штрихов с пробелами.Вот как мой text_general fieldtype выглядит в моей схеме.

  <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <tokenizer class="solr.ClassicTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <charFilter class="solr.HTMLStripCharFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.ClassicTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/>
      <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <charFilter class="solr.HTMLStripCharFilterFactory"/>
    </analyzer>
  </fieldType>

Мой mapping.txt содержит строку ..

"-" => " "

Так что это правило делает, оно конвертируетштрихи к пробелу.

Так что, если я буду искать "адаптер Wi-Fi", он всегда будет показывать те же результаты, что и "wi fi adapter", но не будет показывать результаты для "wifi adapter".

Есть ли способ обработать тире, как это?По сути, я бы хотел относиться к "wifi adapter", "wi-fi adapter", and "wi fi adapter" так же.

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать WordDelimiterGraphFilterFactory для вашего анализатора.У него много атрибутов, которые можно использовать.Я перечислил несколько.

WordDelimiterGraphFilterFactory имеет много атрибутов.

generateWordParts: (целое число, по умолчанию 1) Если не ноль, разделяет слова в разделителях.Например: "CamelCase", "hot-spot" → "Camel", "Case", "hot", "spot"

preserveOriginal: (целое число, по умолчанию 0) Если ненулевое значение, исходный токен сохраняется: "Zap-Master-9000" → "Zap-Master-9000", "Zap", "Master", "9000"

catenateWords: (целое число, по умолчанию)0) Если ненулевой, будут объединены максимальные серии частей слова: "hot-spot-sensor’s" → "hotspotsensor"

Так что в вашем случае это будет выглядеть как

<fieldType name="text_wd" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
          <!-- Splits words based on whitespace characters --> 
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <!-- splits words at delimiters based on different arguments --> 
          <filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1" catenateWords="1"/>
          <!-- Transforms text to lower case -->   
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>

        <analyzer type="query">
          <tokenizer class="solr.WhitespaceTokenizerFactory"/>
          <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
  </fieldType>

Чем больше информации будет найдено Установки доступны в Solr

...