我对Elastic Search很新。我有一个复杂的场景,我无法为此获得正确的解决方案(弹性查询/参数)。任何帮助都将非常感激。
My Fields
除此之外,搜索将始终对唯一用户进行过滤。所以Mysql查询看起来像:
Select * from product where product_name like %xxx% AND price >= price_min AND price <= price_max AND availability = availability_ status AND user = 1;
我喜欢精确的弹性搜索参数来解决这个问题,或者接近解决方案也将受到赞赏。
答案 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;
我们需要:
product_name
match
query
price
字段的range
filter availability
和user
字段term
filter
所有这些都包含在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
}
}
]
}
}
}
}
}