Elasticsearch完全匹配或查询

Mei*_*ign 3 elasticsearch

我的索引中有这样的文档:

{
  "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)

ram*_*laf 5

您可以使用多字段映射.这允许一次发送一个字段,但是以两种不同的方式进行分析.

"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"来过滤.

祝你好运,请随时寻求更多帮助!