2015-08-27 25 views
0

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

我的田地

  • 产品名称(字符串)
  • 价格最小
  • 价格最高
  • 房态状态(可用的编缉/不可用)

的除了这些搜索将始终对唯一用户进行过滤。因此MySQL查询看起来像:

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

我想确切的弹性搜索PARAMS解决这种情况下或附近约的解决方案也可以理解。

回答

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组合。因此,使用

布尔过滤器以AND的所有条款。

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 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}