首页 > 解决方案 > 防止关键字填充 Elasticsearch

问题描述

我正在使用 ES 7.3。我有一个包含标题、部件、型号等的产品索引。我遇到了关键字填充问题,因为某些产品可能在整个文档中多次包含相同的单词、部件或型号。

例如,型号可能在标题中出现两次,也在型号字段中出现。某些产品可能仅在标题中包含型号而不在型号字段中包含。由于该问题,这些产品难以排名。如何防止这种类型的关键字填充?这是我的代码。

字段:

fields = [
          'name^10','name.ngram',
          'part_number^10',


          'mod_name^5', 

          'model_number^5', 

          'brand^10',
          'category^5',
          'product_type^5',
          'search_variations^1'                  
         ]  

fuzzy_fields = [
         'name',
          'part_number',
          'mod_name', 
          'model_number', 
          'brand',
          'category',
          'product_type',
          'search_variations'                  
         ]

询问:

{
         explain: true,
         query:{
           function_score: { 
              "query": {
                "bool": {
                  "should": 
                    [{
                      multi_match:{
                         fields: fields,
                         type: "most_fields", 
                         query: "#{query}"
                       }
                    },
                    {
                      multi_match:{
                         fields: fuzzy_fields,
                         type: "most_fields", 
                         fuzziness: "AUTO",
                         query: "#{query}"
                       }
                    }],
                  "filter": {
                    "bool": { 
                      "must": filters
                    }
                  }
               }
             },field_value_factor:{
                    field: "popularity",
                    modifier: "log1p",
                    factor: 5

                 },
                 boost_mode: "sum"
             }
       },highlight: {
            fields: {
              :"*" => {}
            }
          },
        aggs: {categories: { terms: { field: "category.raw"} }} 

      }

更新

unique过滤器添加到我的映射中确实可以防止在同一字段上匹配重复值,但不会跨多个字段,这是我需要的。

标签: elasticsearchelasticsearch-rails

解决方案


我认为您在查询中想要的是查询选项best_fieldsmulti_match

best_fieldstype 使用单个最佳匹配字段的分数

因此,只有最佳字段才算数,并且如果某些文档在多个字段中匹配,则不会影响分数。


推荐阅读