gpt4 book ai didi

c# - 将文档添加到Elasticsearch时如何引用多个字段

转载 作者:行者123 更新时间:2023-12-03 01:29:45 25 4
gpt4 key购买 nike

我在Elasticsearch服务器中创建了一个索引,并且正在使用.Net客户端NEST连接到它。一些索引属性具有多个字段,我只想填写正确的字段。

我为此映射创建了“文档”类。但我不知道如何访问属性字段。

这是我的映射(概述):

"mappings": {
"document": {
"properties": {

"baseUniqueID": {
"type": "keyword"
},
"description": {
"type": "text",
"fields": {
"en": {
"type": "text",
"analyzer": "english"
},
"fa": {
"type": "text",
"analyzer": "nofapersian"
},
"fr": {
"type": "text",
"analyzer": "french"
}
}
},
"documentDate": {
"type": "date"
},
"documentType_Id": {
"type": "keyword"
},
"id": {
"type": "long"
}

}
}
}

和文档类:

public class Document : BaseInt32KeyEntity
{
public string BaseUniqueID{ get; set; }

public int? Weight { get; set; }

public DateTime DocumentDate { get; set; }

public string Description { get; set; }

public int DocumentType_Id { get; set; }
}
}

我如何才能使Document对象仅填充所需的字段(在此示例description.en中,此字段中),然后使用IndexDocument将其添加到Elasticsearch?像这样的东西:

Document doc = new Document();
doc.Description.en = "This is some description";
ElasticClient.IndexDocument(doc);

最佳答案

您可以使用Update API更新单个字段

var client = new ElasticClient();

var documentId = 1;

var partial = new
{
Description = "This is some description"
};

var updateResponse = client.Update<Document, object>(documentId, u => u
.Index("your_index")
.Doc(partial)
);

仅当您尚未为 .Index()类型设置索引约定时,才需要 Document。要更新的文档使用部分文档建模,因为使用 Document会导致发送值类型(例如 DocumentDateDocumentType_Id属性)的默认值。

doc.Description.en = "This is some description";



无法这样做,因为这不是 multi-fields的工作方式。使用多字段,可以以多种不同方式分析单个文档字段输入,以满足不同的搜索需求。在您的示例中,将通过4种不同方式来分析 Description属性值:

标准分析仪将
  • 与基础text映射
  • 英文分析器的
  • .en多字段映射
  • nofapersian分析器将
  • .fa多字段映射
  • 法国分析仪的
  • .fr多字段映射

  • 分析结果将被索引到反向索引中,以使您可以对其进行搜索和查询,但是发送到Elasticsearch的原始JSON文档将仅包含一个 "description"字段,当您检索 _source时将返回该字段文档(如果存储了 _source,默认情况下为)。

    如果要将这些模型建模为文档上的单独字段,则可以引入具有必要属性的 Description类型
    public class Description
    {
    public string Standard { get;set; }
    public string English { get;set; }
    public string NoFaPersian{ get;set; }
    public string French{ get;set; }
    }

    然后将其索引为 object类型映射,为每个配置分析器
    public class Document
    {
    public string BaseUniqueID { get; set; }
    public int? Weight { get; set; }
    public DateTime DocumentDate { get; set; }
    public Description Description { get; set; }
    public int DocumentType_Id { get; set; }
    }

    var indexResponse = client.CreateIndex("your_index", c => c
    .Mappings(m => m
    .Map<Document>(mm => mm
    .AutoMap()
    .Properties(p => p
    .Object<Description>(o => o
    .Name(n => n.Description)
    .AutoMap()
    .Properties(pp => pp
    .Text(t => t.Name(n => n.Standard).Analyzer("standard"))
    .Text(t => t.Name(n => n.English).Analyzer("english"))
    .Text(t => t.Name(n => n.NoFaPersian).Analyzer("nofapersian"))
    .Text(t => t.Name(n => n.French).Analyzer("french"))
    )
    )
    )
    )
    )
    );

    产生以下创建索引请求
    PUT http://localhost:9200/your_index?pretty=true 
    {
    "mappings": {
    "document": {
    "properties": {
    "baseUniqueID": {
    "type": "text",
    "fields": {
    "keyword": {
    "type": "keyword",
    "ignore_above": 256
    }
    }
    },
    "weight": {
    "type": "integer"
    },
    "documentDate": {
    "type": "date"
    },
    "description": {
    "type": "object",
    "properties": {
    "standard": {
    "type": "text",
    "analyzer": "standard"
    },
    "english": {
    "type": "text",
    "analyzer": "english"
    },
    "noFaPersian": {
    "type": "text",
    "analyzer": "nofapersian"
    },
    "french": {
    "type": "text",
    "analyzer": "french"
    }
    }
    },
    "documentType_Id": {
    "type": "integer"
    }
    }
    }
    }
    }

    关于c# - 将文档添加到Elasticsearch时如何引用多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576309/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com