【问题标题】:Elasticsearch: search for two different document in a single queryElasticsearch:在单个查询中搜索两个不同的文档
【发布时间】:2023-03-23 01:41:05
【问题描述】:

我有两个实体 Merchant 和 Customer:

public class Merchant{
  private UUID id;
  private String name;
  //... other fields and getters/setters
}    

public class Customer{
      private UUID id;
      private String name;
      //... other fields and getters/setters
    }    

这两个实体明显不同。

我想要做的是,当我使用“John”这个词进行搜索时,我想同时获得一个名为“John Market”的商家和一个名为“John Smith”的客户。

为了实现这一点,我将这些实体编入了一个索引。

@Document(indexName = "merchant_customer_index", type = "merchantorcustomer")
public class MerchantOrCustomer {
    @Id
    private UUID id;
    private String name;
    private int type;
    //...

我的查询可以返回 Merchant 和 Customer:

List<MerchantOrCustomer> result = elasticsearchTemplate.queryForList(nativeSearchQuery, MerchantOrCustomer.class);

我以编程方式区分它们(if(result.get(i).getType() == 0 我们收到了商家else 客户) 然后使用他们的 id 从关系数据库中提取实际对象。

我搜索了很多,但找不到任何可以帮助估计它是否是一个好习惯的东西。这是一个好习惯吗?

如果有更好的方法,请给我提示。

【问题讨论】:

  • 如果具有相同id的对象既是商家又是客户怎么办?
  • 我认为 id 是 UUID。所以,如果做得正确,应该很好。
  • @nitzien 我的意思是如果一个实体在应用程序中同时扮演两个角色会怎样:卖东西和买东西?然后我认为 elasticsearch 将只在索引中为给定的id 存储一个对象。
  • 我现在同意@Ivan

标签: java spring-boot elasticsearch spring-data


【解决方案1】:

除非@Ivan 在 cmets 中提到某些勾结,否则您所做的似乎没有任何问题。 如果您使用 elasticTemplate-Spring Data Elasticsearch: Multiple Index with same Document 或使用 queryBuilder-https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search.html

,这是另一种可能的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多