elasticsearch - 不了解 _id 在 ES 上的行为
问题描述
我在 Mongo 数据库中有文档,它们使用 _id 字段作为索引。
我使用 Monstache 将 ES 与 Mongo 的 op log 同步,因此 ES 中的文档具有相同的 _id 字段。
在搜索特定文档时,Kibana 会显示:
标签:tag1 testtag 创建日期:2018 年 10 月 26 日,14:25:57.053 _id:FRaqDPIzWcVI2dl-oA9uUFHLVFQk8qIqqhySWSkM7Ds _type:testobject _index:test.object _score:0
但随后使用 Nest 进行查询,在 Documents 数组中返回:
_id = 0d5aa177-3066-4c6a-aaf5-9b887ae7297f
当我查看 Hits 数组时,我看到:
Id = FRaqDPIzWcVI2dl-oA9uUFHLVFQk8qIqqhySWSkM7Ds
所以在 Documents 中,_id 现在是一个不相关的 guid,但在 Hits 中,_id 被称为 Id,它具有正确的值。
为什么会这样,有没有办法在文档中获得 _id 的正确值?
编辑:更多信息
这是对象;由于它由 MongoDB 和 ES 共享,因此它具有两者的属性。
[Nest.ElasticsearchType, BsonIgnoreExtraElements]
public class TestObject
{
public string _id { get; set; }
public string OwnerId { get; set; }
public Flags Flags { get; set; }
[Nest.Text, BsonIgnoreIfDefault] public string Title { get; set; }
[Nest.Text] public string Tags { get; set; }
[Nest.Ignore] public string Hash { get; set; }
[Nest.Ignore, BsonIgnoreIfDefault] public string Link { get; set; }
}
这是创建索引的代码:
private static void InitializeElasticSearch(string ConnectionString)
{
var Settings = new ConnectionSettings(new Uri(ConnectionString))
.DefaultIndex(_IndexName)
.DefaultFieldNameInferrer(_ => _)
.DefaultMappingFor<TestObject>(_ => _.Ignore(I => I._id));
_ElasticClient = new ElasticClient(Settings);
if (!_ElasticClient.IndexExists(_IndexName).Exists)
{
// create the index
var CreateIndexResponse = _ElasticClient.CreateIndex(_IndexName, C => C
.Settings(S => S
.Analysis(A => A
.CharFilters(Cf => Cf
.Mapping("expressions", E => E
.Mappings(TextLists.Expressions)
)
)
.TokenFilters(Tf => Tf
.Synonym("synonyms", Sy => Sy
.Synonyms(TextLists.Synonyms)
.Tokenizer("whitespace")
)
)
.Analyzers(An => An
.Custom("index", Ca => Ca
.CharFilters("expressions")
.Tokenizer("standard")
.Filters("standard", "synonyms", "stop")
)
)
)
)
.Mappings(M => M
.Map<TestObject>(Mm => Mm
.AutoMap()
.Properties(P => P
.Text(T => T
.Name(N => N.Title)
.Analyzer("index")
)
.Text(T => T
.Name(N => N.Tags)
.Analyzer("index")
)
)
)
)
);
然后,查询代码:
var R = await _ElasticClient.SearchAsync<TestObject>(Sr => Sr
.Query(Q =>
{
// do we query 'all' ?
if (Terms == "*") return Q.MatchAll();
// or do we have a general query
return Q
.MultiMatch(Fu => Fu
.Fields(F => F
.Field(Ff => Ff.Tags)
.Field(Ff => Ff.Title)
)
.Query(Terms)
.Fuzziness(Fuzziness.EditDistance(2))
);
})
.Take(_MaxObjectReturned)
);
解决方案
推荐阅读
- terraform - Terraform 说我必须创建 NS 记录,但它们似乎是默认创建的?
- ruby-on-rails - 如何按作业类、队列名称和参数查询 Sidekiq 队列?
- java - 无法通过我的应用在 Android Studio 中打开另一个应用
- excel - 使用 Excel VBA 添加下一个或上一个字母
- android - DaggerIssueRegistry 未指定供应商
- flutter - Flutter Basics 谁能解释一下这个简单的代码(6行)
- ruby - Ruby 将符号作为关键字参数传递?
- python - Django 应用程序:没有名为“django.core.asgi”的模块
- c# - 并行分发请求
- powerbi - 为什么事实表和暗表之间的单一现有关系无效--AdventureWorksDW