我有以下弹性搜索查询,只有一个术语过滤器。我的查询要复杂得多,但我只是想在这里展示问题。
{
"filter": {
"term": {
"field": "update-time"
}
}
}
当我将带连字符的值传递给过滤器时,我得到零结果。但如果我尝试没有一个没有连字符的值,我会得到结果。我不确定连字符是否是一个问题,但我的情况让我相信。
有没有办法逃脱连字符,所以过滤器会返回结果?我试图用Lushne论坛中读到的反斜杠来逃避连字符,但这并没有帮助。
另外,如果我将一个GUID值传入此字段,该字段是连字符并用花括号括起来,比如 - {ASD23-34SD-DFE1-42FWW},我需要小写字母字符,我需要吗?也是为了逃避花括号?
由于
答案 0 :(得分:82)
我猜你的字段是分析的,这是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”来找到。
答案 1 :(得分:8)
接受的答案对我来说并不适用于弹性6.1。我使用"关键字"解决了它。弹性在字符串字段上默认提供的字段。
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
答案 2 :(得分:1)
基于@imotov的答案如果您使用spring-data-elasticsearch,那么您需要做的就是将您的字段标记为:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
而不是
@Field(type = FieldType.String)
问题是您需要删除索引并使用新映射重新实例化。