【发布时间】:2018-03-19 10:24:59
【问题描述】:
我有一份对 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,那么就会发生这种情况。我的猜测是 terms 寻找完全匹配,但我无法理解这里发生了什么。
【问题讨论】:
-
兴趣字段为
type:text,导致原始文本保存为:["live", "events"]。如果您在该字段中索引了“实时事件”,它会将其存储为上述 2 个单独的标记。当您使用术语查询时,它会尝试直接匹配“实时事件”。你需要match在这里查询。Match将确保您的查询经历与用于存储文档相同的分析阶段。 -
@ArchitSaxena 我需要将兴趣限制为数组作为输入,因此匹配不起作用。有什么方法可以在不重复关键字的情况下完成这项工作?
-
同样的问题,但我正在寻找结果:{ terms: ["live events", "something", "else"] } 任何想法?
标签: elasticsearch