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

使用NEST索引动态对象

太叔航
2023-03-14
问题内容

我正在构建一个API应用程序,该应用程序实质上允许用户构建一个文档,该文档可以按他们想要的方式进行结构化,并将存储在Elasticsearch中。本质上,我为用户提供了一个简单的界面来访问我们的Elasticsearch实例。我试图使实现尽可能简单。到目前为止,这是我要处理的内容。

预期主体的对象:

public class DocumentModel
{
    public string Index { get; set; }
    public string Type { get; set; }
    public string Id { get; set; }
    [ElasticProperty(Type = FieldType.Nested)]
    public dynamic Document { get; set; }
}

简单实施:

[HttpPost]
[Route("")]
public IHttpActionResult Post(DocumentModel document)
{
    Uri nodeLocation = new Uri("http://localhost:9200");
    IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation });
    ConnectionSettings settings = new ConnectionSettings(connectionPool);
    ElasticClient esClient = new ElasticClient(settings);

    IIndexResponse result = esClient.Index(document, i => i
        .Index(document.Index)
        .Type(document.Type)
        .Id(document.Id));

    return Ok(result.IsValid);
}

这可以正常工作,但它在源中包含索引,类型和ID。我真正想做的只是在建立索引时仅提供这三项信息,而实际上只是为动态类型的document.Document编制索引。但是,这似乎与Nest不同,因为它会在IDE和编译时引发错误:

“匿名函数或方法组不能用作动态绑定操作的组成值”

“在未先将lambda表达式转换为委托或表达式树类型之前,不能将lambda表达式用作动态调度操作的参数”。

我怎样才能索引document.Document呢?有没有比使用动态类型更好的方法来处理结构未知的传入JSON文档?


问题答案:

有两种方法可以做到这一点。

尝试将索引建立为动态类型是行不通的,但是您可以通过IndexRequest对象将其索引为一个对象。

dynamic dynamicDoc = new { /*fill in document format here*/ };
ElasticClient esClient = new ElasticClient(esSettings);

IndexRequest<object> request = new IndexRequest<object>(dynamicDoc)
{
    Index = "someindex",
    Type = "SomeType",
    Id = "someid"
};

esClient.Index<object>(request);

或者如果批量处理文件

List<dynamic> Documents = new List<dynamic>();
//Populate Documents

BulkDescriptor descriptor = new BulkDescriptor();
foreach(var doc in Documents)
{
    descriptor.Index<object>(i => i
        .Index("someindex")
        .Type("SomeType")
        .Id("someid")
        .Document(doc));
}

esClient.Bulk(descriptor);

NEST(或更准确地说,Elasticsearch.Net)也有一个.Raw方法变体附加到ElasticClient类,该变体可以索引原始JSON。使用Raw.Index()让我们做这样的事情:

string documentJson = JsonConvert.SerializeObject(document.Document);

ElasticsearchResponse<string> result = esClient.Raw.Index(document.Index, document.Type, document.Id, documentJson);

响应的类型描述符是您期望响应位于的类型(字符串表示您将拥有序列化的json响应,可以对其进行反序列化并对其进行处理)。这使我们可以回避整个对象类型问题,并且NEST完全按预期将文档索引到Elasticsearch中。



 类似资料:
  • 问题内容: 我是ElasticSearch的新手。我正在尝试为索引重新索引以便对其重命名。我正在使用NEST API v5.4。我看到了这个例子: 资料来源 :http : //thomasardal.com/elasticsearch-migrations-with-c-and- nest/ 但是,我无法使用NEST 5.4重现此内容。我认为这是2.4版。我检查ElasticSearch的重大更

  • 问题内容: 我创建了这个功能: 该函数在2个索引中查找搜索词。Visual Studio向我显示以下消息: “已弃用。您可以在查询中指定_index以定位特定索引” 但是我该怎么办呢? 问题答案: 由于不建议使用indexs查询,因此它目前仍可以使用,但不推荐使用该警告是可能在将来的主要版本中将其删除。 您可以通过以下方式实现与索引查询相同的功能: 产生以下查询JSON

  • 我陷入了一个问题,需要在反序列化过程中使用和将解析对象的引用设置为其子对象。 为了描述这个问题,下面是类结构的简单表示。 通过这种结构,我可以通过向我的 提供 来在 中设置,例如: 我知道,我可以添加额外的到我的,但我不知道如何提供我的对象的引用,该对象正在被解析(即时)到对象? 任何帮助将不胜感激!

  • 问题内容: 我有两个具有以下映射的索引(我将简化它们的映射): 1)AccountType映射: 2)ProductType映射: 现在,我有几件事需要弄清楚: 1)首先,有一个索引是一个好主意,在我的情况下是帐户,并且产品是嵌套对象,但是在这里每次我要更新/添加新产品时,我都必须重新索引(更新)整个帐户文件? 2)我的第二个问题是:我想具有搜索功能,因此,如果用户通过在文本框中键入内容进行搜索,

  • 我正在尝试使用NEST c#客户端搜索我的弹性搜索嵌套对象。我的索引名称是”,我的”字段。 这是我的班级: 现在我的web应用程序看起来像这样: 这里是我需要搜索的单词。 我在浏览器的搜索框(网络表单)中输入它。 搜索关键字可能包含任何需要与我的表人员中的任何字段的值匹配。 如果搜索关键字与嵌套文档匹配,则应返回确切的嵌套文档。 我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行

  • 问题内容: 我有一个已创建的公司类型。在该公司类型的内部,我有一个名为“摘要”的字段。如何在此字段中添加多个索引分析器? 我简要地研究了使用Yakaz插件,但似乎无法与NEST一起使用。 其背后的原因是,有时用户会在查询中搜索带有句点的公司名称,而其他时候则不包括句点。我想在公司名称上使用ngram进行部分匹配,带标点和不带标点。我目前正在使用停用词过滤器来删除标点符号。 摘要字段的属性(具有多个