【问题标题】:Range filter not working范围过滤器不起作用
【发布时间】:2013-04-17 01:20:20
【问题描述】:

我正在使用 elasticsearch 搜索引擎,当我运行下面的代码时,返回的结果与范围条件不匹配(我得到的项目的发布日期低于所需的限制):

#!/bin/bash
curl -X GET 'http://localhost:9200/newsidx/news/_search?pretty' -d '{

    "fields": [
        "art_text",
        "title",
        "published",
        "category"
    ],
    "query": {
        "bool": {

            "should": [
                {
                    "fuzzy": {"art_text": {"boost": 89, "value": "google" }}
                },
                {
                    "fuzzy": {"art_text": {"boost": 75, "value": "twitter" }}
                }
            ],
            "minimum_number_should_match": 1
        }
    },
    "filter" : {
        "range" : {
            "published" : {
                "from" : "2013-04-12 00:00:00"
            }
        }
    }

}

'

我还尝试将 range 子句放在 bool 查询中的 must one 中,但结果是一样的。

编辑:我使用弹性搜索通过河流插件在 mongodb 中搜索。这是我用 ES 搜索 mongodb db 的脚本:

#!/bin/bash
curl -X PUT localhost:9200/_river/mongodb/_meta -d '{
        "type":"mongodb",
        "mongodb": {
                "db": "newsful",
                "collection": "news"
        },
    "index": {
            "name": "newsidx",
        "type": "news"
    }
}'

除此之外,我没有创建其他索引。

编辑2:

es 映射的视图:

http://localhost:9200/newsidx/news/_mapping

published: {
    type: "string"
}

【问题讨论】:

  • 您的published 字段是否被索引为日期?您能发布您当前的地图吗?
  • 我编辑了帖子以回答您的问题。

标签: elasticsearch


【解决方案1】:

原因在于您的映射。您用作日期的已发布字段被索引为字符串。这可能是因为您使用的 date format 不是 elasticsearch 中的默认值,因此不会自动检测字段类型,而是将其索引为简单字符串。

您应该使用put mapping api 更改您的映射。您需要在此处将发布的字段定义为日期,指定您使用的格式(可以是多个)并重新索引您的数据。

之后你的范围过滤器应该可以工作了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 2017-02-24
    • 2014-11-02
    • 2019-10-20
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多