用术语filter弹性search连字符问题
我有以下弹性search查询只有一个词条filter。 我的查询是复杂得多,但我只是试图在这里显示的问题。
{ "filter": { "term": { "field": "update-time" } } }
当我将一个连字符值传递给filter时,我得到的结果为零。 但是,如果我尝试没有一个无价值的价值,我得到的结果回来。 我不确定连字符是否是一个问题,但是我的情况让我相信。
有没有办法逃避连字符,所以filter将返回结果? 我试图用Lucene论坛中的斜杠来逃避连字符,但是这并没有帮助。
另外,如果我将一个GUID值传入这个由花括号括起来的字段中,那么我需要小写字母字符,并且需要转义花括号呢?
谢谢
我想你的领域是分析,这是在elasticsearchstring字段的默认设置。 因此,索引时不索引它作为一个术语“更新时间”,而是两个术语:“更新”和“时间”。 这就是为什么你的术语search无法find这个术语。 如果您的字段将始终包含必须完全匹配的值,则最好将映射中的此类字段定义为未分析。 您可以通过使用新映射重新创build索引来完成此操作:
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" } } }'
或者,如果您希望在根据此字段查找logging方面有一定灵活性,则可以保留此字段的分析并使用文本查询:
curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ "query": { "text": { "field": "update-time" } } }'
请记住,如果您的字段被分析,那么这个logging将通过search“更新”或单词“时间”来find。
基于@imotov的答案如果你使用的是spring-data- elasticsearch,那么你所需要做的就是将你的字段标记为:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
代替
@Field(type = FieldType.String)
问题是你需要删除索引,然后用新的映射重新实例化它。