我正在使用ElasticSearch 5.2
我的查询是:
POST /_search
{
"query": {
"bool": {
"filter": [
{ "term": { "tag": "server-dev.user-log" }}
]
}
}
}
我可以使用abcd
这样的标记值进行过滤,但似乎我不能使用ab.cd
我想这是因为Tokenizer。有没有办法说严格对等?或者它是否来自.
以逃避它?
标签映射是:
"tag": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
答案 0 :(得分:1)
您的字段代码很可能有Standard analyzer,而代币server-dev.user-log
则会提供以下代币:
{
"tokens": [
{
"token": "server",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "dev.user",
"start_offset": 7,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "log",
"start_offset": 16,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 2
}
]
}
并且,原因是,你没有匹配,因此应该修复它的是为字段标记添加mapping,使用将保留整个令牌的tokenizer。最简单的选择是KeywordAnalyzer,其中包含如下索引的设置:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "keyword"
}
}
}
},
"mappings": {
"my_type": {
"properties": {
"text": {
"type": "tag",
"analyzer": "my_analyzer"
}
}
}
}
}
答案 1 :(得分:0)
最后,我能够让它像以下一样工作:
POST /_search
{
"query": {
"bool": {
"filter": [
{ "terms": { "tag": ["server", "dev.user", "log"] }}
]
}
}
}
似乎-
是一个标记分隔符
我只想补充说我的配置非常标准。我没有修改映射。映射由流利的。
创建=======&GT;编辑&lt; =======
如果您将tag
替换为tag.keyword
,则不再需要执行上述解决方案(btw不能使用任何值)
POST /_search
{
"query": {
"bool": {
"filter": [
{ "term": { "tag.keyword": "server-dev.user-log" }}
]
}
}
}