首页 > 解决方案 > 不了解 _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)
        );

标签: elasticsearchnest

解决方案


推荐阅读