Я использую ES 7.3, и у меня есть следующий запрос для каталога продуктов, который соответствует двум продуктам, перечисленным ниже, как и ожидалось:
Мой запрос
C700 parts
Мои подходящие продукты
Proform C700 Cardio Cross Trainer Belt
True 700 Deck Model 700
У меня есть третий продукт, который называется Proform C 700 Cardio Cross Trainer Deck
, который занимает место, но находится внизу списка и должен занимать первое или второе место. Проблема сохраняется с запросом C 700 parts
, так что Proform C700 Cardio Cross Trainer Belt
занимает нижнюю часть этого запроса, а продукт C 700
(без пробелов) занимает верхнюю часть. Как сделать так, чтобы оба этих продукта заняли верхние позиции результатов, как ожидалось, содержащие или исключая
? Я использую анализаторы english
и ngram
в поле названия моего продукта. Вот мое отображение:
indexes :name, type: "text", analyzer: "english" do
indexes :ngram, type: "text", analyzer: "ngram"
end
Мой анализатор:
analysis: {
filter: {
ngram_filter: {
type: "ngram",
min_gram: "3",
max_gram: "20",
}
},
analyzer: {
ngram: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "ngram_filter"]
}
}
}
Мой запрос:
{
query:{
function_score: {
"query": {
"bool": {
"must":
[{
multi_match:{
fields: ["name^10", "name.ngram"],
type: "most_fields", #was bool_prefix
query: "#{query}"
}
}],
"filter": {
"bool": {
"must": filters
}
}
}
},field_value_factor:{
field: "popularity",
modifier: "log1p",
factor: 1
},
boost_mode: "sum"
}
},highlight: {
fields: {
:"*" => {}
}
},
suggest: {
text: "#{query}",
simple_phrase: {
phrase: {
field: "name.trigram",
size: 1,
gram_size: 3,
direct_generator: [ {
field: name.trigram,
# min_word_length: 3,
suggest_mode: "always"
} ],
highlight: {
pre_tag: "<em>",
post_tag: "</em>"
}
}
}},
aggs: {categories: { terms: { field: "category.raw"} }}
}