【问题标题】:Partial search on date fields in elasticsearch在elasticsearch中对日期字段进行部分搜索
【发布时间】:2020-10-15 13:39:50
【问题描述】:

我正在尝试对弹性搜索中的日期字段进行部分搜索。例如,如果 startDate 存储为“2019-08-28”,我应该能够在仅查询“2019”或“2019-08”或“2019-0”时检索到相同的数据。

对于其他领域,我正在这样做:

{
            "simple_query_string": {
              "fields": [
                "customer"
              ], 
              "query": "* Andrew *",
              "analyze_wildcard": "true",
              "default_operator": "AND"
            }}

完美适用于文本字段,但同样不适用于日期字段。

这是映射: {"mappings":{"properties":{"startDate":{"type":"date"}}}}

有什么方法可以实现,是改变映射还是其他查询方法?我还发现这个讨论与弹性中的部分日期有关,不确定它是否相关,但这里是:

https://github.com/elastic/elasticsearch/issues/45284

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl elasticsearch-date


    【解决方案1】:

    摘自ES-Docs

    在内部,日期转换为 UTC(如果指定了时区) 并存储为一个长数,表示自时代以来的毫秒数。

    不可能像在文本字段上那样进行搜索。但是,我们可以告诉 ES 将日期字段索引为日期和文本。例如

    索引日期字段为多类型:

    PUT sample
    {
      "mappings": {
        "properties": {
          "my_date": {
            "type": "date",
            "format": "year_month_day",//<======= yyyy-MM-dd
            "fields": {
              "formatted": {
                "type": "text", //<========= another representation of type TEXT, can be accessed using my_date.formatted
                "analyzer": "whitespace" //<======= whitespace analyzer (standard will tokenized 2020-01-01 into 2020,01 & 01)
              }
            }
          }
        }
      }
    }
    
    POST dates/_doc
    {
      "date":"2020-01-01"
    }
    
    POST dates/_doc
    {
      "date":"2019-01-01"
    }
    

    使用通配符查询进行搜索:如果需要,您甚至可以在索引时使用 n-gram 来加快搜索速度。

    GET dates/_search
    {
      "query": {
        "wildcard": {
          "date.formatted": {
            "value": "2020-0*"
          }
        }
      }
    }
    

    【讨论】:

    • 如果它回答了您的问题,请不要忘记投票并接受作为答案。
    • 完美运行。然而,我做了一些添加和更改,以便我可以在整个过程中进行统一的映射。 {"startDate":{"type":"date","fields":{"formatted":{"type":"text","analyzer":"standard"},"keyword":{"type": "keyword","ignore_above":256}} 这个映射也可以用于其他字段,以防有人试图在多个列上实现过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多