我的索引中有这样的文档:
{
"field" : "a, b, c, d, e"
}
Run Code Online (Sandbox Code Playgroud)
字段值是由数组到字符串函数生成的字符串.因此,并非每个文档都具有相同的字符串,但每个文档至少"a, b"具有值.
现在我想要一个匹配2种文档的查询:
仅具有(确切)"a, b"字段值的文档或在字段中包含至少两个搜索字符的文档.
基本上我的问题是,如果对字段进行分析,我无法满足第一个条件,如果字段没有得到分析,我就无法满足第二个条件.是否有一个解决方案没有克隆字段为not_alanyzed?
如果我将字段克隆到未分析的字段(在代码示例field1中),我可以使用此查询.我觉得这个查询对于成就来说太复杂了......:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"or": [
{
"term": {
"field1": "a, b"
}
},
{
"and": [
{
"term": {
"field": "c"
}
},
{
"term": {
"field1": "d"
}
}
]
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用多字段映射.这允许一次发送一个字段,但是以两种不同的方式进行分析.
"properties": {
"field" {
"type": "multi_field",
"fields" : {
"field" : {"type" : "string", "index" : "analyzed"},
"raw" : {"type" : "string", "index" : "not_analyzed"}
}
}
}
Run Code Online (Sandbox Code Playgroud)
正常地将文档发送到elasticsearch(它将在两个地方索引,field(或field.field)和field.raw
现在您的查询将如下所示:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"or": [
{
"term": {
"field.raw": "a, b"
}
},
{
"and": [
{
"term": {
"field": "c"
}
},
{
"term": {
"field": "d"
}
}
]
}
]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不是最优雅的解决方案.我更希望改变存储数据的方式.似乎"a,b"表示不同的东西,可能在文档上有一个布尔字段"a_b_only"来过滤.
祝你好运,请随时寻求更多帮助!
| 归档时间: |
|
| 查看次数: |
9093 次 |
| 最近记录: |