MongoDB-MongoRiver-ElasticSearch-NEST

本文关键字:MongoDB-MongoRiver-ElasticSearch-NEST | 更新日期: 2023-09-27 18:08:24

我已经设置MongoDB数据库与安然邮件收集。蒙古河是蒙古国与蒙古国之间的桥梁。ElasticSearch。我可以在ElasticSearch上通过REST访问Mongo数据。

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

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

MongoDB Details -DB:安然收藏:消息

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"
    }
}

这是我的。net代码为NEST连接Elasticsearch -

    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"));

当我运行上面的代码在电子邮件'body'中搜索"SearchMe"文本时,它返回0个结果。

需要帮助。快把我逼疯了

MongoDB-MongoRiver-ElasticSearch-NEST

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

localhost: 9200/mongoindex/_search吗?q =身体:"SearchMe"

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

localhost: 9200/mongoindex/信息/_search吗?q =身体:"SearchMe"

然而,这意味着你的查询将不匹配你实际想要的

localhost: 9200/mongoindex/信息/_search吗?q =身体:"SearchMe"

既然你说你的类型是Messages

ES Details- Index: MongoIndex类型:Messages

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

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

你可以在文档中看到更多关于如何影响NEST推断类型、索引名、属性名等方式的选项。