Solr searchField схема для одного совпадения

Я хотел бы написать конкретный fieldType, который будет работать, как показано в примере ниже:
Скажем, у нас есть имя: foo MooBar (f00B2r);

  • "f" => foo MooBar (f00B2r) (и другие с "F")
  • "foo moob" => foo MooBar (f00B2r) (и другие с "foo moob" и т. д.)
  • "foo (f0" => foo MooBar (f00B2r)
  • "moobar f" => foo MooBar (f00B2r)
  • "(f00b2r)" => foo MooBar (f00B2r)
  • "бар" => нет
  • "moobar o" => нет
  • "moob foo" => нет

Мои проблемы:

  1. Если я буду искать "moobar f", я не получу ничего;
  2. Если я буду искать "(f00b2r)", я ничего не получу;

мой fieldType в solr / conf / schema.xml:

<fieldType name="frontMatch" class="solr.TextField" positionIncrementGap="255">
  <analyzer type="index">
    <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" />
  </analyzer>
</fieldType>

PS
Извините за мой английский и спасибо;

1 ответ

Решение

Решение для меня:
Часть scheme.xml

<fieldType name="frontMatch" class="solr.TextField" positionIncrementGap="0" >
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="255" side="front" />
  </analyzer>
</fieldType>

Это решает вторую проблему.
Чтобы решить первый:
Каждый запрос должен выполняться с Proximity;
Число 1000000 равно оператору "И" при поиске.
Итак, поисковый запрос выглядит так: name:"moobar f"~1000000;
где name это поле, в котором мы ищем;

Другие вопросы по тегам