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

Multi/All elasticsearch嵌套字段中的动态搜索

漆雕彬彬
2023-03-14

我使用Spring-Data-ElasticSearch2.0.8和ElasticSearch.2.2.0来动态搜索嵌套对象。

基本上,我的嵌套对象可以有很少的嵌套字段,但我希望在所有这些字段中动态搜索。例如,一个动物文档可以有3x个字段来描述它:名称/大小/描述。

我想在所有这些搜索,因为我的搜索结束点只是有一个‘描述’自由文本选项。因此,当用户在他的入口点键入'15'或'dog'时,搜索将检查'name'、'size'和'description'字段,并从其中返回一些内容。

我的映射看起来像:

{
    "mappings": {
        "animal_doc": {
            "properties": {
                "animal_description": {
                    "type": "nested",
                    "include_in_parent": true,
                    "properties": {
                        "name": {
                            "type": "string"
                        },
                        "size": {
                            "type": "string"
                        },
                        "description": {
                            "type": "string"
                        }
                    }
                },
           }
      }
  }

我读过以下两个部分:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html和https://www.elastic.co/blog/management-relations-inside-elasticsearch

因为这可以通过使用(spring-data-es)创建查询来解决:

boolQuery.must(QueryBuilders.nestedQuery("animal_description", 
addMatchQuery("animal_description."+field, value)));

因此,每次我都会查询object.nestedfield:value,但我不希望每次都指定字段,而是希望它是动态的--在嵌套的'animal_description'字段内--所有内部字段都将被搜索。

理想的解决方案如下所示:

boolQuery.must(QueryBuilders.nestedQueryGetAllFields("animal_description",value)));

谢了!

共有1个答案

濮阳振海
2023-03-14

从您的描述中可以看出,您可能希望使用一般的查询字符串。当您查询少数特定字段时。例如,假设您要搜索一个通用的

动物描述

您的查询如下所示:

GET /_search
{
    "query": {
        "query_string" : {
            "fields" : ["properties.size", "properties.name", "properties.description"],
            "query" : "animal description"
        }
    }
}

使用此查询的选项非常多,我建议您在这里查看它们

 类似资料:
  • 问题内容: 我对ES还是相当陌生,并正在将其用于我的新项目。首先,我为客户提供了一个简单的映射,其中包含名字和姓氏以及付款信息对象列表。如果我在SQL中执行此操作,那将类似于客户表和具有1:许多关系的付款信息表。 这是我要执行的操作的一个简单示例:https : //gist.github.com/anonymous/6109593 我希望根据payInfos嵌套数组中的任何匹配项找到任何客户,即

  • 我试图为一个业务场景制定一个查询,其中我们有一个名为“types”的嵌套字段类型(即类似于字符串的ArrayList)。下面是以“类型”作为字段之一的索引文档示例。 文件1:{“类型”:[{“标签”:“对话”,},{“标签”:“暴力”,},{“标签”:“语言”,}} 文档2:{“类型”:[{“标签”:“对话框”,}} 现在,要求搜索查询最多匹配字段值中的一个值,即如果用户搜索“对话框”,那么它应该

  • 问题内容: 假设我有一个像这样的领域模型: 现在,我可以像这样创建一个教师比较器: 但是,我如何像这样在嵌套字段上比较Lecture? 我无法在模型上添加方法。 问题答案: 您不能嵌套方法引用。您可以改用lambda表达式: 无需反向顺序,它就不再那么冗长了: 注意:在某些情况下,您需要明确声明泛型类型。对于 例如,下面的代码不会没有工作,之前在Java中8。 较新的Java版本具有更好的自动类型

  • 我使用的是ES版本5.6。我有一个像下面这样的文档存储在ES中。 我想搜索所有已“启用”的字段。 我尝试了以下查询,但都不起作用。 但是下面的查询起作用了 因此,看起来只匹配顶级字段,而不匹配嵌套字段。是否有任何方法可以查询包含在所有字段中的文本,包括嵌套字段。我不想显式指定嵌套字段名。我正在寻找一种全局搜索,我想在文档中的任何地方搜索“文本”。 谢了。

  • 问题内容: 考虑一下这样的Elasticsearch中的文档: 我想搜索时不知道它是在文档的第一层还是第二层。这可能吗?还请记住,嵌套级别可以是任何东西(在开发时未知)。 如果可能的话,在不知道文档第二级中存在的情况下通过搜索返回该文档的查询是什么? 问题答案: 试试这个:

  • 问题内容: 我正在尝试使用以下映射搜索文档: 我想在“ naam”,“ omschrijving”等中进行搜索,但也想在嵌套文档“ kenmerken”的动态映射中进行搜索,因此我创建了两个搜索查询,但它们似乎都不起作用。 我应该使用布尔还是过滤器?或两者结合? 我什至靠近吗? 问题答案: 由于需要解决方案,因此我决定创建一个单独的字符串字段,在其中分解“ kenmerken”字段。目前,此方法可