57

我有以下只有术语过滤器的弹性搜索查询。我的查询要复杂得多,但我只是想在这里说明问题。

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

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

有没有办法逃避连字符,以便过滤器返回结果?我尝试使用从 Lucene 论坛中读到的反斜杠来转义连字符,但这并没有帮助。

此外,如果我将 GUID 值传递到这个用大括号括起来并用大括号括起来的字段中,例如 - {ASD23-34SD-DFE1-42FWW},我是否需要将字母字符小写,是否需要转义花括号也可以吗?

谢谢

4

3 回答 3

89

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

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”来找到。

于 2012-07-19T18:38:25.050 回答
38

接受的答案不适用于弹性 6.1。我使用弹性默认在字符串字段上提供的“关键字”字段解决了它。

{
    "filter": {
            "term": {
                    "field.keyword": "update-time"
                }
        }
}
于 2018-01-29T14:09:03.003 回答
1

根据@imotov的回答如果您使用的是spring-data- elasticsearch那么您需要做的就是将您的字段标记为:

@Field(type = FieldType.String, index = FieldIndex.not_analyzed)

代替

@Field(type = FieldType.String)

问题是您需要删除索引并使用新映射重新实例化它。

于 2016-09-14T11:13:37.553 回答