模糊查询Elasticsearch结果中未显示高结果

时间:2019-03-15 04:55:46

标签: elasticsearch search

嗨,我正在尝试使用Elasticsearch在查询中使用模糊来创建“您的意思是”建议。例如,当用户搜索单词“ applo”时,它将改为显示“ apple”(因为存在包含单词apple的产品/品牌名称)。因此,我想突出显示模糊匹配的单词(“苹果”)并将其显示给用户。

这是我的财产

 "properties": {
                "brand_name": {
                    "type": "keyword",
                    "store": true
                },
               {
                "product_name": {
                    "type": "keyword",
                    "store": true
                },
}

这是我的查询

var should = { "should": [
        {
          "multi_match": {
            "fields": ["product_name", "brand_name"],
            "query": "applo",
            "fuzziness": 2,
            "prefix_length": 1
          }
        },
        {
          "query_string": {
            "query": "*" + applo + "*",
            "fields": ["product_name", "brand_name"]
          }
        }
      ],
        "minimum_should_match": 1
    };

body = {
    size: 50,
    from: 0,
    query: {
      bool: should
    },
    aggs: buildAggregate(),
    "highlight": {
      "fields": {
        "brand_name": {},
        "product_name": {}
      }
    }
  };

模糊和查询工作正常,并给出正确的结果。但是,结果中没有突出显示字段。我的查询中缺少什么,或者映射属性有什么变化?

数据示例:

 { took: 67,   timed_out: false,   _shards: { total: 5, successful: 5,
 skipped: 0, failed: 0 },   hits: { total: 2, max_score: null, hits: [
 [Object] ] },   aggregations:    { brands:
       { doc_count_error_upper_bound: 0,
         sum_other_doc_count: 0,
         buckets: [Array] },
      minimum: { value: 1000 },
      maximum: { value: 1000 },
      values:
       { doc_count_error_upper_bound: 0,
         sum_other_doc_count: 0,
         buckets: [Array] } } }

点击对象:

{ _index: 'product',
  _type: 'product',
  _id: '1',
  _score: null,
  _source:
   { 
       product_name: 'Apple Watch',
       brand_name: 'Apple'
   }
}

1 个答案:

答案 0 :(得分:0)

开始吧:

  1. 您的映射不适用于模糊搜索。您需要了解textkeyword数据类型之间的区别。简而言之,关键字已按原样编入索引并且无法更改。将文本转换为令牌,并将更多转换应用于令牌。为了获得更多的理解,我建议如何阅读索引过程开始阅读this article。然后,我建议更改您的映射:
"properties": {
   "brand_name": {
       "type": "text"
   },
   "product_name": {
      "type": "text"
    }
 }
  1. 此更改之后,您失去了在这些字段上运行聚合的功能。这是思考的重点。因为:如果使用字段数据,则会损失性能,并增加存储量。

  2. 最后,我建议将查询简化为query_string:

{
  "query": {
     "query_string": {
       "query": "applo~1"
     }
  }
}

了解此查询here