当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:查找不包含比查询中更多术语的文档

孙永思
2023-03-14

如果我有文件

1: { "name": "red yellow" }
2: { "name": "green yellow" }

我想用“红棕色黄”查询,得到文档1。

我怎么能这么做?反过来很容易...

共有1个答案

谢夜洛
2023-03-14

首先,您必须将字段声明为FieldData:true,以便在其上执行脚本:

PUT test
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fielddata": true
      }
    }
  }
}

然后,您可以在查询中使用脚本过滤结果:

POST test/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": {
            "source": """
                boolean res = true;
                for (item in doc['name']) {
                   res = 'red brown yellow'.contains(item) && res;
                 }
                 return res;
              """,
            "lang": "painless"
          }
        }
      },
      "must": [
        {
          "match": {
            "name": "red brown yellow"
          }
        }
      ]
    }
  }
}

请注意,文本字段上的fielddata可能花费很大,如果fou可以将该字段索引为数组上的关键字,则效果更好,如下所示:

1: { "name": ["red","yellow"] }
2: { "name": ["green", "yellow"] }

搜索请求可以完全相同

 类似资料:
  • 我在嵌套文档上合并term,must_not查询时遇到了困难。 Sense示例可以在这里找到:http://Sense.qbox.io/gist/be436a1ffa01e4630a964f48b2d5b3a1ef5fa176 下面是我的映射: 该索引中有两个文档: 你能给我一些解决这个问题的线索吗? 谢谢。

  • 另外,类型中的所有文档都存储了上面提到的community的值。感谢帮助。

  • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

  • 我试图获取缺少字段“topic.description”和匹配项“fundedunder.programme”:“abc”的文档。 映射: 我的查询如下所示:

  • 问题内容: 我有以下 匹配 查询字符串: 我想它的意思是,但实际上它能执行。 然后我尝试了 术语 查询字符串: 它执行,显示 术语 查询通过数组支持多个OR条件。 我很好奇为什么 匹配 查询不支持通过数组的 OR 条件?并且它不显示任何语法错误。 问题答案: 该查询仅支持要指定的单个字符串值。官方文档中没有明确指定它,但是如果您愿意阅读的源代码,则可以看到,在解析字段时,解析器将跳过标记来分隔数组

  • 问题内容: 在ElasticSearch中是否有可能形成可以保留术语顺序的查询? 一个简单的例子是使用标准分析器为这些文档建立索引: 你知道要搜索 你知道搜索 知道为您搜寻 我可以查询,这将返回所有文档,包括第三个文档。 如果我只想检索按此特定顺序排列有术语的文档怎么办?我可以构成一个查询吗? 考虑到仅通过引用文本即可获得短语:(检索第一和第二文档)在我看来,应该有一种方法可以保留不相邻的多个术语