弹性搜索复杂场景

时间:2015-08-27 19:25:42

标签: mysql elasticsearch

我对Elastic Search很新。我有一个复杂的场景,我无法为此获得正确的解决方案(弹性查询/参数)。任何帮助都将非常感激。

My Fields

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

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

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

我喜欢精确的弹性搜索参数来解决这个问题,或者接近解决方案也将受到赞赏。

2 个答案:

答案 0 :(得分:0)

您需要在此处使用过滤器,因为您需要完全匹配而不是全文匹配。而这种方式更快。

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

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

  

bool过滤到AND所有术语。

答案 1 :(得分:0)

所以给出了你的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
              }
            }
          ]
        }
      }
    }
  }
}