Ранжирование терминов, которые содержат пробелы - PullRequest
0 голосов
/ 30 сентября 2019

Я использую 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"} }} 

      }
...