【问题标题】:Two filters (RANGE) in different fields in elasticsearchelasticsearch中不同字段的两个过滤器(RANGE)
【发布时间】:2020-04-20 14:02:55
【问题描述】:

我是 elasticsarch 的初学者,我希望下面的查询能够使用两个过滤器,具有两个不同字段范围,但只有第一个范围有效。

此过滤器工作正常:

“范围”:{“pgrk”:{“gte”:1,“lte”:10}}

谁能告诉我为什么下面的第二个过滤器不起作用?

“应该”:{ “范围”:{“url_length”:{“lte”:100}}

--------------使用两个过滤器按照我的查询------------- -------------

 {

    "from" : 0, "size" : 10,

    "sort" : [
            { "pgrk" : {"order" : "desc"} },

             { "url_length" : {"order" : "asc"} }
        ],

        "query": {

    "bool": {
    "must": {

    "multi_match" : {
    "query": "netflix",

    "type": "cross_fields",
    "fields": [ "titulo", "descricao", "url" ],
    "operator": "and"
            }
         },
         "filter": {
         "range" : {"pgrk" : { "gte" : 1, "lte" : 10}    }
          },


    "should" : {
            "range" : {"url_length" : { "lte" : 100 } }
            }

            }
    }


          }

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    不确定,由于未提供索引映射和示例文档,您的要求是什么,但我创建了自己的映射和示例文档向您展示如何在过滤器上下文中创建多个范围查询。

    请评论,如果结果不符合您的要求,我可以修改。

    索引定义

    {
        "mappings": {
            "properties": {
                "title": {
                    "type": "text"
                },
                "url": {
                    "type": "keyword"
                },
                "pgrk": {
                    "type": "integer"
                },
                "url_length": {
                    "type": "integer"
                }
            }
        }
    }
    

    索引示例文档

    {
        "title": "netflix",
        "url" : "www.netflix.com", --> this shouldn't match as `pgrk > 10`
        "pgrk": 12,
        "url_length" : 50
    }
    
    {
        "title": "Netflix",  --> this should match both filetrs
        "url" : "www.netflix.com",
        "pgrk": 8,
        "url_length" : 50
    }
    
    {
        "title": "Netflix", --> this should match both filetrs
        "url" : "www.netflix",
        "pgrk": 5,
        "url_length" : 50
    }
    

    { “标题”:“Netflix”, “网址”:“www.netflix”, “pgrk”:5, "url_length" : 80. --> 注意 pgrk 与 prev 具有相同的 5 并且 url_length 是 diff }

    搜索查询

    {
        "from": 0,
        "size": 10,
        "sort": [
            {
                "pgrk": {
                    "order": "desc"
                }
            },
            {
                "url_length": {
                    "order": "asc"
                }
            }
        ],
        "query": {
            "bool": {
                "must": {
                    "multi_match": {
                        "query": "netflix",
                        "type": "cross_fields",
                        "fields": [
                            "title",
                            "url"
                        ],
                        "operator": "and"
                    }
                },
                "filter": [ --> note filter array to have multiple range queries in filter context
                    {
                        "range": {
                            "pgrk": {
                                "gte": 1,
                                "lte" : 10
                            }
                        }
                    },
                    {
                        "range": {
                            "url_length": {
                                "lte": 100
                            }
                        }
                    }
                ]
            }
        }
    }
    

    而搜索结果只带来三个文档(甚至两个具有相同的pgrk 值)

     "hits": [
                {
                    "_index": "so_range",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": null,
                    "_source": {
                        "title": "netflix",
                        "url": "www.netflix.com",
                        "pgrk": 8,
                        "url_length": 50
                    },
                    "sort": [
                        8,
                        50
                    ]
                },
                {
                    "_index": "so_range",
                    "_type": "_doc",
                    "_id": "3",
                    "_score": null,
                    "_source": {
                        "title": "netflix",
                        "url": "www.netflix",
                        "pgrk": 5,
                        "url_length": 50
                    },
                    "sort": [
                        5,
                        50
                    ]
                },
                {
                    "_index": "so_range",
                    "_type": "_doc",
                    "_id": "4",
                    "_score": null,
                    "_source": {
                        "title": "netflix",
                        "url": "www.netflix",
                        "pgrk": 5,
                        "url_length": 80
                    },
                    "sort": [
                        5,
                        80
                    ]
                }
            ]
    

    【讨论】:

    • 如果您使用具有不同值的字段 (url_length) 创建文档,则查询仅通过字段过滤器 (pgrk) 起作用。过滤器(url_length)不起作用
    • @Jean,我尝试了不同的 url_length 值,它可以正常工作,更新答案
    • @Jean,很高兴它有帮助,您可以投票并接受答案,在此先感谢 :)
    • Hello @Opster 假设在我的映射中,我有一个名称字段(URL:“type”:“keyword”)存储索引站点的 url,在 elasticsearch 中有一些函数在索引 DOC 时,elasticsearch 本身会计算存储 URL 的大小,而无需通过 PHP 计算 URL 大小。因为我想按照 URL 的大小,从最小值到最大值对查询返回的结果进行排序。谢谢
    • @Jean,开箱即用,elasticsearch 不提供此类功能,我假设大小在这里表示 MB,您可以对弹性进行一些黑客攻击,但这会很复杂,因为您是新手elastic 不建议您这样做,因为它可能会导致一些意想不到的结果和性能不佳,您很难排除故障。您已经在做正确的事情来在您的应用程序中计算这个大小并将其存储在 Elastic 的不同字段中:)
    【解决方案2】:

    @Opster

    你好吗?

    因为当我在查询中使用 (From / Size) 函数时,它不会返回我希望返回的文档。比如我在elasticsearch中有5个文档,所有文档都按顺序,id 1, id 2, id 3, id 4, id 5。

    文档 ID 5 包含单词 (car),并且在查询中我说要从 ID 4 获取单词 (car)(“from”:4,“size”:1,)它不返回 ID 5它有单词 (car),但在查询中我输入了 doc 5 中存在的信息,所以我应该带上 doc 5,但它没有并说它没有找到结果。如果我从 ID 0 ("from": 0, "size": 1,) 进行查询,它会找到 ID 5。似乎弹性搜索与 ID 混淆了。你能告诉我身份证怎么办吗?

    下面从 ID 4 的查询不会返回 ID 5,但是如果我从 ID 0 开始查询,那么它会返回 ID 5

    {
    "from": 4, "size": 1,
    "query": {
    "multi_match": {
    "query": "car",
    
       "type": "cross_fields",
       "fields": ["title", "description", "url"],
       "operator": "and"
    }
    }
    }
    

    【讨论】:

    • @Opster 你好吗?因为当我在查询中使用(From / Size)函数时,没有找到正确的文档,正如我在上面的帖子中解释的那样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多