Как добавить полную фразу токенизатор в Nest для Elasticsearch?

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

например, если у меня есть музыкальный объект json и я хочу организовать побочные эффекты в зависимости от жанра, я хочу, чтобы каждый жанр представлял собой весь жанровый термин (ритм и блюз), а не один аспект для "ритма" и один для "блюза" ", и я хочу иметь возможность искать" ритм-н-блюз "и сопоставлять его с" ритм-н-блюз "(случай уведомления).

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

вот предложение от упругого поиска, которое я упомянул: (в середине страницы) http://www.elasticsearch.org/blog/starts-with-phrase-matching/

Я хочу иметь возможность сказать что-то вроде (в моем POCO в псевдокоде):

[ElasticProperty(Analyzer = "tokenizer, lowercase"]
public string Genre { get; set; }

1 ответ

Используйте тип мультиполя в вашем отображении. Это позволит вам проиндексировать поле "Жанр" двумя способами - проанализировать (используя стандартный или строчный анализатор) для проведения поиска и not_analyzed для фасетирования.

Для более сложных отображений, подобных этому, отображение на основе атрибутов в NEST не обрезает его. Вам придется использовать свободный API, например:

client.CreatIndex("songs", c => c
.AddMapping<Song>(m => m
    .MapFromAttributes()
    .Properties(props => props
        .MultiField(mf => mf
            .Name(s => s.Genre)
            .Fields(f => f
                .String(s => s.Name(o => o.Genre).Analyzer("standard"))
                .String(s => s.Name(o => o.Genre.Suffix("raw")).Index(FieldIndexOption.not_analyzed)))))));

Надеюсь это поможет!

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