我正在我正在处理的站点中实施 elasticseach 并尝试构建多范围过滤器。有 2 个字段具有我需要过滤的范围:价格和评级。每个人都应该能够一次选择多个范围。因此,例如,您应该能够按 80-85 OR90-95的评分进行过滤,同时还可以按 10-15 OR20-25的价格进行过滤。我正在使用post_filter术语和范围过滤器,因为我正在为搜索结果构建分面导航。您可以在下面看到我发送的结构化 json。
{
"from": 0,
"size": 15,
"query": {
"multi_match": {
"query": "taz 2003",
"type": "most_fields",
"operator": "or",
"fields": [
"name",
"vintage",
"brand^4",
"review"
],
"fuzziness": "1"
}
},
"post_filter": {
"bool": {
"must": [
{
"term": {
"vintage": "2009"
}
}
],
"should": [
{
"range": {
"price": {
"gte": 10,
"lt": 15
}
}
},
{
"range": {
"price": {
"gte": 20,
"lt": 25
}
}
},
{
"range": {
"rating": {
"gte": 80,
"lt": 85
}
}
},
{
"range": {
"rating": {
"gte": 90,
"lt": 95
}
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
这几乎有效,但是因为所有范围都在一个shouldbool 过滤器内,它OR用于组合它们,所以它只匹配一个过滤器。我需要的是它执行以下操作(在 SQL 中):
SELECT * FROM `table` where
vintage = 2009 AND
(
(
price BETWEEN 10 AND 15 OR
price BETWEEN 20 AND 25
) AND
(
rating BETWEEN 80 AND 85 OR
rating BETWEEN 90 AND 85
)
);
Run Code Online (Sandbox Code Playgroud)
我目前对如何实现这一目标感到茫然。预先感谢您的帮助。
一种方法是nested bool在must
例子:
{
"from": 0,
"size": 15,
"query": {
"multi_match": {
"query": "taz 2003",
"type": "most_fields",
"operator": "or",
"fields": [
"name",
"vintage",
"brand^4",
"review"
],
"fuzziness": "1"
}
},
"post_filter": {
"bool": {
"must": [
{
"term": {
"vintage": "2009"
}
},
{
"bool": {
"should": [
{
"range": {
"price": {
"gte": 10,
"lt": 15
}
}
},
{
"range": {
"price": {
"gte": 20,
"lt": 25
}
}
}
]
}
},
{
"bool": {
"should": [
{
"range": {
"rating": {
"gte": 80,
"lt": 85
}
}
},
{
"range": {
"rating": {
"gte": 90,
"lt": 95
}
}
}
]
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4805 次 |
| 最近记录: |