【问题标题】:Elastic Search Complex Scenario弹性搜索复杂场景
【发布时间】:2015-08-31 11:41:16
【问题描述】:

我对弹性搜索很陌生。我有一个复杂的场景,我无法为此获得正确的解决方案(弹性查询/参数)。任何帮助将不胜感激。

我的领域

  • 产品名称(字符串)
  • 最低价格
  • 最高价格
  • 可用性状态(可用/不可用)

除此之外,搜索将始终针对唯一用户进行过滤。所以 Mysql 查询看起来像:

Select * from product where product_name like %xxx% AND price >= price_min AND price <= price_max AND availability = availability_ status AND user = 1;

我喜欢精确的弹性搜索参数来解决这个场景或附近的解决方案也将不胜感激。

【问题讨论】:

    标签: mysql elasticsearch


    【解决方案1】:

    您需要在此处使用过滤器,因为您需要完全匹配而不是全文匹配。这样它甚至更快。

     {
      "query": {
        "filtered": { 
          "query": {
            "match": { "name": "YourName" }
          },
          "filter": {
            "bool": {
               "must": [ 
               { "range": { "price_min": { "gte": 20 }}},
               { "range": { "price_max": { "lte": 170 }}},
               { "term" : { "availability" : "false" }} ]
            }
          }
        }
      }
    }
    

    您在“yourName”中提供的是全文匹配(如果分析了名称字段,则会检索相似的名称)。我假设您将其保持不变,因此默认情况下会分析该字段(词干+停用词删除)。 由于您需要结果来匹配所有条件,因此它是一个 AND 组合。因此使用

    布尔过滤器与所有术语。

    【讨论】:

      【解决方案2】:

      鉴于您的 SQL 查询

      SELECT * 
        FROM product
       WHERE product_name LIKE '%xxx%' 
         AND price >= price_min 
         AND price <= price_max 
         AND availability = availability_status 
         AND user = 1;
      

      我们需要:

      所有这些都包裹在filtered query 中,其过滤器将过滤掉所有不匹配的文档,最后match 查询将对剩余文档运行以匹配product_name

      正确的查询将如下所示:

      {
        "query": {
          "filtered": {
            "query": {
              "match": {
                "product_name": "xxx"
              }
            },
            "filter": {
              "bool": {
                "must": [
                  {
                    "range": {
                      "price": {
                        "gte": 20,
                        "lte": 170
                      }
                    }
                  },
                  {
                    "term": {
                      "availability": "availability_status"
                    }
                  },
                  {
                    "term": {
                      "user": 1
                    }
                  }
                ]
              }
            }
          }
        }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2018-04-21
      • 2019-11-13
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多