c# - MongoDB-MongoRiver- Elasticsearch -NEST

标签 c# mongodb elasticsearch nest elasticsearch-mongo-river

我已经使用 Enron 邮件收集设置了 MongoDB 数据库。 MongoRiver 用于连接 Mongo 和 ElasticSearch。我可以通过 ElasticSearch 上的 REST 访问 Mongo 数据。

在配置 MongoRiver 时,我已经创建了一个索引“MongoIndex”

问题:当我使用 NEST(.NET C#) 从 ES 连接/获取数据时,它返回 0 个文档,而相同的查询在 REST 上返回结果。

MongoDB 详细信息 - 数据库:安然 集合:消息

ES 详情- 索引:MongoIndex 类型:消息

集合中消息的单一文档格式 -

{
    "_id" : ObjectId("4f2ad4c4d1e2d3f15a000000"),
    "body" : "Here is our forecast\n\n ",
    "subFolder" : "allen-p/_sent_mail",
    "mailbox" : "maildir",
    "filename" : "1.",
    "headers" : {
        "X-cc" : "",
        "From" : "phillip.allen@enron.com",
        "Subject" : "",
        "X-Folder" : "\\Phillip_Allen_Jan2002_1\\Allen, Phillip K.\\'Sent Mail",
        "Content-Transfer-Encoding" : "7bit",
        "X-bcc" : "",
        "To" : "tim.belden@enron.com",
        "X-Origin" : "Allen-P",
        "X-FileName" : "pallen (Non-Privileged).pst",
        "X-From" : "Phillip K Allen",
        "Date" : "Mon, 14 May 2001 16:39:00 -0700 (PDT)",
        "X-To" : "Tim Belden ",
        "Message-ID" : "<18782981.1075855378110.JavaMail.evans@thyme>",
        "Content-Type" : "text/plain; charset=us-ascii",
        "Mime-Version" : "1.0"
    }
}

这是我的 NEST 连接 Elasticsearch 的 .Net 代码 -

    public class Message
    {
        public string id { get; set; }
        public string body { get; set; }
        public string mailbox { get; set; }
        public string filename { get; set; }

        [ElasticProperty(Type = FieldType.Nested)]
        public IList<HeadersComponent> headers { get; set; }
    }

    public class HeadersComponent
    {
        public string Cc { get; set; }
        public string Bcc { get; set; }
        public string From { get; set; }
        public string Subject { get; set; }
        public string To { get; set; }
        public string Date { get; set; }        
    }


    Uri node = new Uri("http://localhost:9200");
    ConnectionSettings settings = new ConnectionSettings(node, "MongoIndex");
    ElasticClient client = new ElasticClient(settings);

    ISearchResponse<Message> searchResponse = client.Search<Message>(s => s.Query(q => q.Term(p => p.body, "SearchMe"));

当我运行上述代码在电子邮件“正文”中搜索“SearchMe”文本时,它返回 0 个结果。

需要这方面的帮助。这让我发疯:)

最佳答案

我认为它可能是您的 Elasticsearch type。查看您在评论中提供的请求,表明您正在查询索引中的所有类型。

localhost:9200/mongoindex/_search?q=body:"SearchMe"

然而,NEST 默认会在请求中添加一个类型。这将导致以下请求字符串

localhost:9200/mongoindex/message/_search?q=body:"SearchMe"

但是这意味着您的查询将不会像您实际想要的那样匹配

localhost:9200/mongoindex/messages/_search?q=body:"SearchMe"

既然你说你的类型是Messages

ES Details- Index: MongoIndex Type: Messages

但是,在您的查询中,您将类型的推断留给了 NEST。默认情况下,这将产生一种类型的 Message。有许多选项可以解决此问题,但要确认这一点,您可以尝试明确设置要使用的类型。

var searchResponse = client.Search<Message>(s => s
    .Type("Messages")
    .Query(q => q
        .Term(p => p.body, "SearchMe")
    )
);

您可以在 documentation 中看到有关如何影响 NEST 推断类型、索引名称、属性名称等方式的更多选项。 .

关于c# - MongoDB-MongoRiver- Elasticsearch -NEST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32070894/

相关文章:

elasticsearch - 如何获取字段的doc_values值?

elasticsearch - Elastic Search 中的 ConnectTransportException

c# - Emgu CV 捕获类不存在

mongodb - "Random"来自 MongoDB 的样本返回严重倾斜的结果

php - 是否可以在没有关系数据库的情况下使用 Symfony2/Doctrine 表单验证?

mysql - 将 Metabase 与 Docker SQL 或 Docker MongoDB 容器连接

ruby-on-rails - 如何将命名范围应用于轮胎搜索结果?

c# - Enumerable.Count()==n 的替代品

c# - 在 GDI+ 中递归绘制矩形时出现 OutOfMemory 异常

c# - 当我调用 ThrowIfCancellationRequested() 时,OperationCanceledException 未被用户代码处理