我有一个索引字段'properties.language',其值为'en sv'。该字段有一个multi_field映射,由两个字段组成,一个分析(名称'language'),另一个not_analyzed(name'_exact')。
如何在不查询'properties.language'和'properties.language._exact'的情况下发出单个搜索查询?
修改
这是我的配置:
索引数据:
{
"_index": "51ded0be98035",
"_type": "user",
"_id": "WUzwcwhTRbKur7J5ZY_hgA",
"_version": 1,
"_score": 1,
"_source": {
"properties": {
"language":"en sv"
}
}
}
“用户”类型的映射:
{
"user": {
"properties": {
"properties": {
"properties": {
"language": {
"type": "multi_field",
"fields": {
"language": {
"type": "string",
"analyzer": "standard",
"index": "analyzed"
},
"_exact": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
}
搜索查询:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [{
"or": [{
"term": {
"properties.language": "en sv"
}
}, {
"term": {
"properties.language._exact": "en sv"
}
}]
}]
}
}
}
}
}
答案 0 :(得分:3)
考虑使用Elasticsearch内置多值字段(即数组)来索引language
字段:http://www.elasticsearch.org/guide/reference/mapping/array-type/。就像您目前一样,将index
设置为not_analyzed
。
在为数据编制索引而不是单个值'en sv'
时,请改为['en', 'sv']
,而ES将负责其余的工作。
对于查询,您可以执行以下操作来查找同时包含en
和sv
的项目:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [{
"term": {
"properties.language": "en"
}
}, {
"term": {
"properties.language": "sv"
}
}]
}
}
}
}
}
甚至更好,使用terms
查询/过滤器代替term
找到更大的简洁/灵活性:http://www.elasticsearch.org/guide/reference/query-dsl/terms-query/