我有以下文件:
{
...
_source: {
id: 1,
tags: [
"xxx"
]
}
},
{
...
_source: {
id: 2,
tags: [
"xxx yyy"
]
}
}
如果我只想检索第一个文档,如何搜索"xxx"
?
我尝试过:
"query" : {
"filter" : {
"term" : {
"tags" : "xxx"
}
}
}
但是它与两个文档一起返回。
答案 0 :(得分:2)
您的基本问题是,您尚未定义显式映射,因此默认映射将起作用。假设您正在使用最新版本5或6。
在标签字段中搜索的内容是经过分析的文本,因此它将为xxx yyy
创建令牌xxx
和yyy
,它们也与您的搜索匹配。
GET _analyze
{
"text": "xxx yyy"
}
您可以查询多字段tags.keyword
,该字段将为您提供完全匹配的内容(不分析字段值)。例如:
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"tags.keyword": "xxx"
}
}
}
}
}
或者另一种可能性,并且从一开始就直接使用关键字类型。 tags
通常属于keyword
类型,或者未经分析。
定义映射
PUT test
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"doc": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}
}
PUT test/doc/1
{
"tags": [
"xxx"
]
}
PUT test/doc/2
{
"tags": [
"xxx yyy"
]
}
使用上面的映射,您可以搜索tags
。