带有术语过滤器的弹性搜索连字符问题

Gab*_*bar 50 escaping filter term elasticsearch

我有以下弹性搜索查询,只有一个术语过滤器.我的查询要复杂得多,但我只想在这里展示问题.

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

当我将带连字符的值传递给过滤器时,我得到零结果.但如果我尝试没有一个没有连字符的值,我会得到结果.我不确定连字符是否是一个问题,但我的情况让我相信.

有没有办法逃脱连字符,所以过滤器会返回结果?我试图用Lushne论坛中读到的反斜杠来逃避连字符,但这并没有帮助.

另外,如果我将一个GUID值传入此字段,该字段是连字符并用花括号括起来,比如 - {ASD23-34SD-DFE1-42FWW},我需要小写字母字符,我是否需要逃避花括号呢?

谢谢

imo*_*tov 82

我猜你的字段是分析的,这是elasticsearch中字符串字段的默认设置.因此,当它被索引时,它没有被索引为一个术语"更新时间",而是被索引为2个术语:"更新"和"时间".这就是你的术语搜索无法找到这个术语的原因.如果您的字段将始终包含必须完全匹配的值,则最好在映射中将此字段定义为未分析.您可以通过使用新映射重新创建索引来完成此操作:

curl -XPUT http://localhost:9200/your-index -d '{
    "mappings" : {
        "your-type" : {
            "properties" : {
                "field" : { "type": "string", "index" : "not_analyzed" }
            }
        }
    }
}'

curl -XPUT  http://localhost:9200/your-index/your-type/1 -d '{
    "field" : "update-time"
}'

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "filter": {
        "term": {
                "field": "update-time"
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望在基于此字段查找记录时具有一定的灵活性,则可以保持此字段的分析并使用文本查询:

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "query": {
        "text": {
                "field": "update-time"
        }
    }
}'
Run Code Online (Sandbox Code Playgroud)

请记住,如果您的字段被分析,那么通过搜索单词"update"或单词"time"来找到该记录.

  • 很好的答案.您可能希望将"文本"更改为"匹配".看起来像elasticsearch弃用文本并用匹配替换它. (2认同)

I.d*_*ies 11

接受的答案对弹性6.1不起作用.我使用弹性在字符串字段上提供的"关键字"字段解决了它.

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,更改映射意味着我们必须创建一个新索引。谢谢 :) (2认同)
  • 确认此功能自 ES 7.12 起有效。谢谢你! (2认同)