我有一个他们对ElasticSearch感兴趣的用户列表:
这是我的映射:
mappings: {
users: {
properties: {
username: {
type: 'text',
analyzer: 'autocomplete',
search_analyzer: 'autocomplete'
},
interests: {
type: 'text'
},
locations: {
type: 'text'
},
roles: {
type: 'text'
}
}
}
},
settings: {
analysis: {
analyzer: {
autocomplete: {
type: 'custom',
tokenizer: 'autocomplete',
filter: ['lowercase']
}
},
tokenizer: {
autocomplete: {
type: 'edge_ngram',
min_gram: 3,
max_gram: 10,
token_chars: [
'letter', 'digit'
]
}
}
}
}
这是一个示例文档:
{
"_index": "users",
"_type": "users",
"_id": "4",
"_score": 1.0,
"_source": {
"username": null,
"interests": [
"live events"
],
"locations": [
"abington",
"connecticut"
],
"roles": [
]
}
}
现在我搜索:
{
terms: ["live events"]
}
我没有结果。我检查过,如果该术语包含space
,则会发生这种情况。我的猜测是条款会查找完全匹配,但我无法理解这里发生了什么。
答案 0 :(得分:4)
您应该仅对关键字数据类型使用term/terms
查询。在您的情况下,您正在查询带有text datatype
的字段,如映射中所示:
interests: {
type: 'text'
}
在这种情况下,您必须使用匹配查询,所以:
{
"query": {
"match" : {
"interests" : "live events"
}
}
}