elasticsearch,term,Filter,Escaping,elasticsearch,Term" /> elasticsearch,term,Filter,Escaping,elasticsearch,Term" />

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

Filter 带有术语过滤器的弹性搜索连字符问题,filter,escaping,elasticsearch,term,Filter,Escaping,elasticsearch,Term,我有下面的弹性搜索查询,只有一个术语过滤器。我的问题要复杂得多,但我只是想在这里说明问题 { "filter": { "term": { "field": "update-time" } } } 当我将一个连字符的值传递给过滤器时,返回的结果为零。但如果我尝试不使用未被忽略的值,我会得到结果。我不确定连字符在这里是否是一个问题,但我的场景让我相信这一点 有没有办法转义连字符以

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

{
    "filter": {
            "term": {
                    "field": "update-time"
                }
        }
}
当我将一个连字符的值传递给过滤器时,返回的结果为零。但如果我尝试不使用未被忽略的值,我会得到结果。我不确定连字符在这里是否是一个问题,但我的场景让我相信这一点

有没有办法转义连字符以便筛选器返回结果?我从Lucene论坛上读到,我曾试图用反斜杠来避开连字符,但没有用

此外,如果我将GUID值传递到这个字段中,该字段用连字符连接并用大括号括起来,比如-{ASD23-34SD-DFE1-42FWW},我是否需要将字母表字符小写,是否也需要将大括号转义


谢谢

我猜您的字段已被分析,这是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”即可找到此记录。

根据答案,如果您正在使用,则只需将您的字段标记为:

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

@Field(type = FieldType.String)

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

对于弹性6.1,接受的答案不适用于我。我使用elastic默认为字符串字段提供的“关键字”字段解决了这个问题

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

我只是想加上这个作为回答。谢谢你的详细解释。回答得很好。您可能需要将“文本”更改为“匹配”。看起来像elasticsearch不推荐使用的文本,并将其替换为匹配。我浪费了一天的时间才发现无法取回任何文档的问题不是由于错误的查询,而是由于我的测试示例中的连字符……我浪费了两天……这对我来说很有效,更改映射意味着我们必须创建一个新索引。谢谢:)谢谢你的回答!确认其在ES 7.12中起作用。非常感谢。