Elasticsearch 将字符串与空格、列、破折号完全匹配

Elasticsearch match string with spaces, columns, dashes exactly

我正在使用 Elasticsearch 6.8,并尝试在 python 笔记本中编写查询。这是用于我正在使用的索引的映射:

{ "mapping": { "news": { "properties": { "dateCreated": { "type": "date", "format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis" }, "itemId": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "market": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "timeWindow": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }

我正在尝试搜索 精确 字符串,例如“[2020-08-16 10:00:00.0,2020-08-16 11:00:00 .0]”在“timeWindow”字段(这是一个“文本”类型,而不是“日期”字段),还有 select by market="en-us"(市场也是一个“文本”字段).这个字符串有空格,冒号,逗号,很多白字,不知道怎么查询才正确

目前我有这个查询:

res = es.search(index='my_index', 
    doc_type='news', 
    body={
    'size': size,
    'query':{
        "bool":{
            "must":[{
                "simple_query_string": {
                    "query": "[2020-08-17 00:00:00.0,2020-08-17 01:00:00.0]",
                    "default_operator": "and",
                    "minimum_should_match":"100%"
                }
            },
            {"match":{"market":"en-us"}}
            ]
        }  
    }
})

问题是它与我的 timeWindow 字符串的“simple_query_string”不完全匹配(我知道这个字符串被标记化了,分成了“2020”、“08”、“17”等部分“00”、“01”等,并且每个标记都被单独分析),我得到了我想要排除的不同的 timeWindow 值,比如

['[2020-08-17 00:00:00.0,2020-08-17 01:00:00.0]'
 '[2020-08-17 00:05:00.0,2020-08-17 01:05:00.0]'
 ...
 '[2020-08-17 00:50:00.0,2020-08-17 01:50:00.0]'
 '[2020-08-17 00:55:00.0,2020-08-17 01:55:00.0]'
 '[2020-08-17 01:00:00.0,2020-08-17 02:00:00.0]']

有没有办法做我想做的事?

UPD(和答案): 我当前的查询使用“term”和“timeWindow.keyword”,这个组合允许我精确搜索带有空格和其他白色字符的字符串:

res = es.search(index='msn_click_events', doc_type='news', body={
    'size': size,
    'query':{
            "bool":{
                "must":[{
                    "term": {
                        "timeWindow.keyword": tw
                    }
                },
                {"match":{"market":"en-us"}}
                ]
            }  
        }
    })

而此查询 selects 只有正确的 timewindows 值(字符串):

['[2020-08-17 00:00:00.0,2020-08-17 01:00:00.0]'
 '[2020-08-17 01:00:00.0,2020-08-17 02:00:00.0]'
 '[2020-08-17 02:00:00.0,2020-08-17 03:00:00.0]'
 ...
 '[2020-08-17 22:00:00.0,2020-08-17 23:00:00.0]'
 '[2020-08-17 23:00:00.0,2020-08-18 00:00:00.0]']

在您的 timeWindow 字段上您需要一个 keyword aka exact search 但您正在使用 full-text 查询并且您将此字段定义为 text 字段并且您已经猜到了正确,它在索引时间内得到分析,因此您没有得到正确的结果。

如果您使用的是动态映射,那么将为映射中的每个 text 字段生成 .keyword 字段,因此您只需在查询中使用 timeWindow.keyword 即可会工作。

如果您定义了映射,则需要添加关键字字段来存储 timewindow,重新索引数据并在查询中使用该 keyword 字段以获得预期结果。