当前位置: 首页 > 面试题库 >

在ElasticSearch中加入查询

楚宪
2023-03-14
问题内容

有什么办法(查询)在ElasticSearch中加入以下2个JSON

{
product_id: "1111",
price: "23.56",
stock: "100"
}

{
product_id: "1111",
category: "iPhone case",
manufacturer: "Belkin"
}

以上2种JSON在Logstash中以2种不同类型处理(输入),因此它们的索引在Elasticsearch中归档的不同“类型”中可用。

我想要的是在product_id字段上加入2个JSON。


问题答案:

当您说加入时,这取决于您的打算。Elasticsearch与支持表之间的JOIN的常规数据库不同。它是一个文本搜索引擎,用于管理索引中的文档。

另一方面,您可以使用每种类型共有的字段在多个类型的同一索引内进行搜索。

例如,以您的数据为例,我可以创建一个具有2种类型的索引,它们的数据如下所示:

curl -XPOST localhost:9200/product -d '{
    "settings" : {
        "number_of_shards" : 5
    }
}'

curl -XPOST localhost:9200/product/type1/_mapping -d '{
        "type1" : {
            "properties" : {
                "product_id" : { "type" : "string" },
                "price" : { "type" : "integer" },
                "stock" : { "type" : "integer" }
            }
        }   
}'

curl -XPOST localhost:9200/product/type2/_mapping -d '{
        "type2" : {
            "properties" : {
                "product_id" : { "type" : "string" },
                "category" : { "type" : "string" },
                "manufacturer" : { "type" : "string" }
            }
        }
}'

curl -XPOST localhost:9200/product/type1/1 -d '{
        product_id: "1111", 
        price: "23",
        stock: "100"
}'

curl -XPOST localhost:9200/product/type2/1 -d '{
        product_id: "1111",
        category: "iPhone case",
        manufacturer: "Belkin"
}'

我有效地创建了一个名为product的索引,具有2个type1和type2。现在,我可以执行以下查询,它将返回两个文档:

curl -XGET 'http://localhost:9200/product/_search?pretty=1' -d '{
    "query": {
        "query_string" : {
            "query" : "product_id:1111"
        }
    }
}'

{
  "took" : 95,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.5945348,
    "hits" : [ {
      "_index" : "product",
      "_type" : "type1",
      "_id" : "1",
      "_score" : 0.5945348, "_source" : {
    product_id: "1111",
    price: "23",
    stock: "100"
}
    }, {
      "_index" : "product",
      "_type" : "type2",
      "_id" : "1",
      "_score" : 0.5945348, "_source" : {
    product_id: "1111",
    category: "iPhone case",
    manufacturer: "Belkin"
}
    } ]
  }
}

原因是因为Elasticsearch将搜索该索引内的所有文档,而不管其类型如何。这与JOIN还是有区别的,在这种意义上,Elasticsearch不会对属于每种类型的文档进行笛卡尔积。

希望能有所帮助



 类似资料:
  • 问题内容: 假设我们有两种索引类型:成员和餐厅。两者都包含城市属性。 我想过滤成员(例如按名称),并希望在结果中包括成员所在城市/城市的餐馆名称列表。 是否可以仅使用一个ES查询来执行此操作?我猜它应该类似于数据库联接。 谢谢。 问题答案: ES没有联接的概念。这是因为它是索引而不是关系数据库。最好打两个电话。一个获取会员的文件,然后另一个获取餐厅。 除非您有特殊情况,否则这仍然应该非常有效。

  • 问题内容: 我想查询的数据是和是。编写常用的SQL很容易: 但是,对Elasticsearch进行查询对我来说并不容易。 首先,我查询了: 结果是我所期望的。 然后,我查询了: 它也运作良好。 但是我无法使用和操作将2个条件连接在一起的查询。如何将这两个匹配查询合并为一个使用和操作? 问题答案: 您需要的是布尔查询,您可以在其中输入所有单个查询: (我无法测试查询,这可能是错误的,但是bool-q

  • 问题内容: 在Elasticsearch中进行等效于SQL连接的最佳方法是什么? 我有一个带有两个大表的SQL安装程序:Persons和Items。一个人可以拥有 许多 物品。人员和项目行都可以更改(即更新)。我必须运行按人员和项目方面进行筛选的搜索。 在Elasticsearch中,您似乎可以使Person成为Item的嵌套文档,然后使用。 但是:如果您随后更新一个Person,我认为您需要更新

  • 问题内容: 我目前正在使用ElastSearch查询,该查询当前看起来如下所示: 因此,现在当条件1或条件2匹配时,将忽略文档。查询的外观如何,以便仅忽略符合条件1和条件2的文档? 问题答案: 由于不可能更新elasticsearch版本,因此我不得不找到另一个解决方案。这对我有用:

  • 我正在使用elasticsearch从json文件中过滤和搜索,我是这项技术的新手。所以我有点困惑如何在ElasticSearch中编写查询。 这是oracle查询。如何在ElasticSearch中编写此查询?我使用的是elasticsearch版本6.8.13

  • 问题内容: 我对.net中的elasticsearch客户端进行了一项小型研究,发现NEST是对此问题最受支持的解决方案之一。 我正在查看Nest的文档,但我找不到从查询输出原始json并避免将序列化为对象的方法,因为我在前端使用了angularJs,所以我不想重载该过程通过一些不必要的步骤将信息发送给客户端。 ......而且我还想知道如何覆盖序列化过程? 我发现NEST使用Json.NET,我