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

弹性搜索条件查询

岳嘉容
2023-03-14

我在术语查询中要求弹性搜索中的嵌套字段,其中嵌套字段值应与术语查询中提供的值的数量完全匹配。例如,考虑下面的查询,在这里我们对名为类型的嵌套字段进行查询。

GET资产/_search

{
      "size": "10",
      "from": 0,
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "Types",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "Types.Label.keyword": 
                            ["VOD, AOP"]
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
  }

索引映射

{
  "media-assets": {
    "mappings": {
      "dynamic": "true",
      "properties": {
        "Types": {
          "type": "nested",
          "properties": {
            "Label": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256,
                  "normalizer": "lowercase_normalizer"
                },
                "ngram": {
                  "type": "text",
                  "analyzer": "ngram_tokenizer_analyzer"
                }
              }
            }
          }
        }
      }
    }
  }
}

样本文件:

{
  "_source": {
    "AssetId": 1657352,
    "MaterialId": "XBV01001",
    "AirDate": "1997-03-10T00:00:00Z",
    "Types": [
      {
        "Type": "AOP"
      },
      {
        "Type": "VOD"
      }
    ]
  }
}

上述查询应返回字段类型正好有2个值的文档,即“VOD”

共有2个答案

叶冥夜
2023-03-14

尝试以下方法。

{
      "size": "10",
      "from": 0,
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "Types",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "Types.Label.keyword": 
                            ["VOD, AOP"]
                        }
                      },
           {
                "script": {
                    "script": {
                        "inline": "doc['Types.Label'].length == 2,
                        "lang": "painless"
                    }
                }
            }
                    ]
          }
                }
              }
            }
          ]
        }
      }
  }

注意:脚本查询的性能很慢,如果可能的话,可以考虑在查询结果后过滤查询结果。

长孙作人
2023-03-14

您需要使用下面搜索查询中定义的script\u score,以及函数分数查询。

添加带有索引数据、映射、搜索查询和搜索结果的工作示例

索引映射:

{
  "mappings": {
    "properties": {
      "Types": {
        "type": "nested"
      }
    }
  }
}

索引数据:

{
  "Types": [
    {
      "Label": "VOD"
    },
    {
      "Label": "AOP"
    },
    {
      "Label": "ABC"
    }
  ]
}
{
  "Types": [
    {
      "Label": "VOD"
    },
    {
      "Label": "AOP"
    }
  ]
}

搜索查询:

{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "Types",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "terms": {
                          "Types.Label.keyword": [
                            "VOD",
                            "AOP"
                          ]
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "params._source.containsKey('Types') && params._source['Types'] != null && params._source.Types.size() == 2 ? 1 : 0"
            }
          }
        }
      ],
      "min_score": 1
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "67639937",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "Types": [
            {
              "Label": "VOD"
            },
            {
              "Label": "AOP"
            }
          ]
        }
      }
    ]
 类似资料:
  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?

  • 如何获得空数组和美国的结果和

  • 关于如何打开缓存有什么建议吗?

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。