我有下面的Elastic Search查询,只有一个术语筛选器。我的查询要复杂得多,但我只是想在这里展示问题。
{
"filter": {
"term": {
"field": "update-time"
}
}
}
当我将一个用连字符连接的值传递给过滤器时,我得到的结果为零。但是,如果我尝试不使用无连字符的值,我会得到结果。我不确定连字符在这里是否是一个问题,但我的方案让我相信是这样的。
有没有办法转义连字符,以便过滤器返回结果?我试着用一个反斜杠来转义连字符,这是我在Lucene论坛上读到的,但是没有用。
另外,如果我将一个GUID值传入这个用连字符连接并用大括号括起来的字段,例如- {ASD23-34SD-DFE1-42FWW},我是否需要将字母表字符小写,是否也需要转义大括号?
谢谢
发布于 2012-07-20 02:38:25
我猜你的字段已经被分析了,这是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”即可找到此记录。
发布于 2018-01-29 22:09:03
在elastic 6.1中,公认的答案对我不起作用。我用elastic在字符串字段上默认提供的"keyword“字段解决了这个问题。
{
"filter": {
"term": {
"field.keyword": "update-time"
}
}
}
发布于 2016-09-14 19:13:38
根据@imotov的回答,如果您使用的是spring-data-elasticsearch,那么您需要做的就是将您的字段标记为:
@Field(type = FieldType.String, index = FieldIndex.not_analyzed)
而不是
@Field(type = FieldType.String)
问题是您需要删除索引,并使用新的映射重新实例化它。
https://stackoverflow.com/questions/11566838
复制相似问题