一尘不染

术语过滤器的elasticsearch连字符问题

elasticsearch

我只有一个词过滤器,下面的elasticsearch查询。我的查询要复杂得多,但我只是想在此处显示问题。

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}

当我将带连字符的值传递给过滤器时,返回的结果为零。但是,如果我尝试不使用未连接的值,则会得到结果。我不确定连字符是否在这里成为问题,但是我的情况使我相信。

有没有办法避免连字符,以便过滤器返回结果?我曾尝试从Lucene论坛上读到带有反斜杠的转义符,但这无济于事。

另外,如果我将GUID值传递给带有连字符并用花括号括起来的该字段,则类似-{ASD23-34SD-
DFE1-42FWW}的代码,我需要小写字母字符并且需要转义大括号呢?

谢谢


阅读 270

收藏
2020-06-22

共1个答案

一尘不染

我想您的字段已经过分析,这是elasticsearch中字符串字段的默认设置。结果,当它被索引时,它不是被索引为一个术语“ update-
time”,而是被索引为两个术语:“ update”和“
time”。这就是为什么您的术语搜索找不到该术语的原因。如果您的字段将始终包含必须完全匹配的值,那么最好在映射中将此类字段定义为未分析。您可以通过使用新映射重新创建索引来做到这一点:

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"
        }
    }
}'

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

curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{
    "query": {
        "text": {
                "field": "update-time"
        }
    }
}'

请记住,如果对您的字段进行了分析,那么只需搜索单词“ update”或单词“ time”,即可找到该记录。

2020-06-22