【问题标题】:How do you get elasticsearch to create unique ids for objects created via REST?如何让 elasticsearch 为通过 REST 创建的对象创建唯一 ID?
【发布时间】:2020-01-29 22:29:41
【问题描述】:

简短版:我如何获得弹性搜索来为对象生成身份,并将其用作“_id”并将其设置在对象中。

长版本:在一个 RESTful API 中,我通常不知道要插入数据库的对象的 ID。例如,我可能会为“Pasta Salad”创建一个食谱

我的休息电话(和身体)会是这样的

POST /api/v1/recipe

{
  "title": "Pasta Salad",
  "details": "..."  
}

在 C# 中,我对此的表示是这样的......

public class Recipe
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Details { get; set; }
}

我不希望调用者知道如何生成一个未被使用的 id,我希望任何存储对象的东西都能创建一个 id。通常在数据库中,我会生成一个序列/作为标识列来执行此操作。

然后读取将返回给我填充下一个 id 值的对象。

如何让elasticsearch在创建文档时生成C#对象的Id属性,使其唯一,然后在elasticsearch中也用它作为_id值?

这就是我在 ConnectionSettings 中的内容

var connectionSettings = new ConnectionSettings(elasticSearchUri)
    .DefaultIndex(elasticSearchDefaultIndex)
    .DefaultMappingFor<Recipe>(r => r.IdProperty(x => x.Id));

这就是我在 elasticsearch 中创建文档的方式...

        var recipe = new Recipe
        {
            Title = "Pasta Salad",
            Details = "..."
        };

        var response = await _elasticClient.IndexDocumentAsync(recipe);

浏览http://localhost:9200/default/_doc/_search

...所以 elasticsearch 生成了一个唯一的“_id”值,但没有在对象本身上设置“Id”

"hits":{"total":{"value":1,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"default","_type":"_doc","_id":"3oeo8W8BfYYLXBBW8Vac","_score":1.0,"_source":{"title":"Pasta Salad","details":"..."}}]}}

如果我包含一个 id(在我的 C# 对象中),_id 和对象的 id 都按预期设置,问题是,我在插入时不知道 id,我如何获得弹性搜索来获得下一个唯一 ID?

"hits":{"total":{"value":1,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"default","_type":"_doc","_id":"1","_score":1.0,"_source":{"id":1,"title":"Pasta Salad","details":"..."}}]}}

【问题讨论】:

    标签: .net elasticsearch nest


    【解决方案1】:

    您可以将“_id”值分配为您想要的任何值。因此,在您的情况下,将对象的 Id 值分配给 Elasticsearch 文档的 _id 属性将起作用。

    【讨论】:

    • 不是我的意思。我怎么知道有哪些唯一 ID 可用?例如,当使用带有标识列的数据库时,我会插入行(没有 id),并且会为我设置 id。如果我必须自己设置 id,我必须在 elasticsearch 中查询最大 id,将 id 加一,然后使用该 id 在 elasticsearch 中创建文档,在此期间另一个实例可能使用了该 id。我在我的问题中也注意到了这一点。你明白我的意思吗?
    • GET index/_doc/{id} 会起作用吗?我的建议是生成 UUID 或使用自动生成的 id 而不是顺序键。
    • 如何“使用自动生成的 id”?
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 2022-11-28
    • 2019-06-14
    • 1970-01-01
    • 2011-08-14
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多