0

我已经建立了 ElasticSearch 的基本实现,在文档中存储了几个字段,我能够执行查询。

var searchResult = client.Search<SearchTest>(s =>
    s
    .Size(1000)
    .Fields(f => f.ID)
    .Query(q => q.QueryString(d => d.Query(query)))
    )
    .Documents.Select(item =>
        item.ID
        )
    .ToList();

var products = this.DbContext.Products
    .Where(item =>
        searchResult.Contains(item.ProductId)
        && ...
        )
    .Select(item => ...);

// subsequent queries here

现在,我只返回索引,我在数据库查询中使用它来检索大量信息。还检索存储在文档中的信息。现在我想知道,我是否应该跳过从数据库中检索它,并使用文档存储中的数据?还是我应该只将它用于搜索?

一些上下文:在产品数据库中搜索,一些信息总是相同的,一些信息(如价格计算)取决于哪个客户正在搜索。

4

2 回答 2

1

我看到您已经接受了答案,但我想提供第二种方法。

Elasticsearch 擅长存储文档 (json),因此检索完整的对象图可以是一种非常快速且强大的方法,可以克服阻抗不匹配和 N+1 敏感数据库查询。

对我来说,最好的方法是searchResults已经成为最终列表,IEnumerable<Product>而不必事后进行 N 个数据库查询。

Elasticsearch(与原始 lucene 甚至 Solr 不同)有一个特殊的字段来存储原始 json 图,_source因此加载整个文档的开销非常小。

这是以基本上必须将数据写入两次为代价的,一次写入数据库,一次写入弹性搜索每个突变。根据您的架构,这可能会也可能不会实现。

我同意@femtoRgon 的观点,即能够从外部数据源重新索引是一个好主意,但是 Elasticsearch 开发人员正在非常努力地为 1.0 获取正确的备份和恢复。这将大大减少对第二个数据存储的需求。

顺便说一句,不确定您是否知道,但指定.Fields()已经强制 Elasticsearch 仅加载指定字段而不是特殊字段中的整个图表_source

于 2013-07-03T18:00:25.403 回答
1

这个问题并没有真正的硬性和快速的答案。我喜欢从索引中提取足够的信息来填充搜索结果列表,但从其他外部来源(例如数据库)检索文档的全部内容。完全主观地,从我所见,这似乎是 Lucene 更常见的用法。

据我所知,存储策略不应该对搜索性能产生直接影响,但是将每个文档的存储数据保持在最低限度将提高从索引中检索文档的性能(即,对于前面提到的结果列表)。

我有时也会犹豫是否让 Lucene 成为记录系统。发现自己的索引损坏/损坏似乎比数据库容易得多。我喜欢有可用于垃圾和重建它的选项。

于 2013-07-02T16:25:24.477 回答