我想在ElasticSearch中存储邮件的标签。我已经将tags字段定义为:
{
'tags': {
'type': 'string',
'index_name': 'tag'
}
}
对于消息,我在标签字段中存储了以下列表:
['a','b','c']
现在,如果我尝试使用以下查询搜索标记“b”,它会返回消息和标记:
{
'filter': {
'limit': {
'value': 100
}
},
'query': {
'bool': {
'should': [
{
'text': {
'tags': 'b'
}
}
],
'minimum_number_should_match': 1
}
}
}
标签'c'也一样。 但如果我用这个搜索标签'a':
{
'filter': {
'limit': {
'value': 100
}
},
'query': {
'bool': {
'should': [
{
'text': {
'tags': 'a'
}
}
],
'minimum_number_should_match': 1
}
}
}
它完全没有结果! 答案是:
{
'hits': {
'hits': [],
'total': 0,
'max_score': None
},
'_shards': {
'successful': 5,
'failed': 0,
'total': 5
},
'took': 1,
'timed_out': False
}
我做错了什么? ('a'是列表中的第一个元素并不重要,['b','a','c'也是如此。)似乎只有一个'a'字符存在问题
答案 0 :(得分:1)
如果您未设置任何分析器并映射到索引,则默认情况下Elasticsearch会使用自己的分析器。 Elasticsearch的{{1}}具有停用词过滤器,默认忽略英语停用词,例如:
default_analyzer
在进行更多操作之前,请检查ElasticSearch映射和分析器指南:
答案 1 :(得分:0)
可能会涉及一些词汇或停止词汇列表。尝试确保不分析该字段。
'tags': {'type': 'string', 'index_name': 'tag', "index" : "not_analyzed"}