3

Sitecore.NET 6.6.0(修订版 130404)

我们的生产网站搜索量很大,我们的 Lucene 索引全天都被大量查询。这相当于在 Lucene 查询处理上花费了大量的 CPU 能力。是否有行业惯例将 Lucene 索引和查询卸载到不同的机器上?或者是否有任何硬件机制可用于提高 Lucene 查询性能?

(我们最常用的 Lucene 索引包含少于 10,000 个条目)

更新(更多信息):

尽管我们的索引包含少于 10,000 个,但 CPU 使用率是否是由并行执行的大量 Lucene 查询引起的?我们有一个非常复杂的多面搜索。最初,当用户尝试各种搜索条件时,我们会在所有搜索选项旁边显示结果计数细分(每个搜索请求会产生 50-60 个计数查询)。这导致在高流量期间 CPU 使用率达到 90-95%。当我们删除计数时,CPU 稳定在 20-30% 左右。

以下是我们用于查询的两种方法:

    public static Document[] GetLuceneDocuments(ACIndex acIndex, Query query, Sort sort = null, int maxResults = 999, bool trackScores = false, bool fillFields = true)
    {
    Index index = SearchManager.GetIndex(GetIndexName(acIndex));

    if (sort == null)
    {
        sort = new Sort(new SortField(null, SortField.SCORE));
    }

    using (IndexSearchContext searchContext = index.CreateSearchContext())
    {
        Lucene.Net.Search.IndexSearcher searcher = searchContext.Searcher;

        TopFieldCollector collector = TopFieldCollector.create(sort, maxResults, fillFields, trackScores, false, false);
        searcher.Search(query, collector);
        TopDocs topdocs = collector.TopDocs();

        Document[] documents = new Document[topdocs.ScoreDocs.Length];
        for (int i = 0; i < topdocs.ScoreDocs.Length; i++)
        {
            documents[i] = searcher.Doc(topdocs.ScoreDocs[i].doc);
        }

        return documents;
    }
    }

    public static int GetSearchResultCount(ACIndex acIndex, Query query)
    {
        Index index = SearchManager.GetIndex(GetIndexName(acIndex));

        using (IndexSearchContext searchContext = index.CreateSearchContext())
        {
            Lucene.Net.Search.IndexSearcher searcher = searchContext.Searcher;

            TopScoreDocCollector collector = TopScoreDocCollector.create(1, false);
            searcher.Search(query, collector);
            return collector.GetTotalHits();
        }
    }
4

5 回答 5

2

您应该考虑为您的搜索实施 Solr。虽然不是该主题的专家,但 Solr 是基于 Lucene 的(使转换更容易)并运行在一个或多个中央服务器上,处理您的所有搜索需求。

在 Sitecore 7 之前的版本中,Solr 本身并没有得到官方的官方支持——但我已经研究过许多使用 Solr 的 Sitecore 6 解决方案。

这篇文章应该给你一个领先的开始:如何在 Sitecore 中实现 Solr

就行业流程而言,使用 Sitecore,Solr 是解决这一特定问题的解决方案。但是,根据您的解决方案实施,可能需要做一些事情才能起床和继续。

于 2013-10-03T11:48:10.717 回答
0

您可以查看 www.alpha-solutions.dk/sitecore-search-solution 以了解 Solr on Sitecore 6 方法。注意:我隶属于 Alpha Solutions

于 2013-10-03T15:47:11.847 回答
0

您的索引很小,我知道有人建议您重新构建整个解决方案,但是,我推荐我过去做过的一些对我来说效果很好的东西,并且不需要您配置另一台服务器或安装另一个索引工具,如 Elastic或 SOLR。

首先,将字段存储在您所关注的索引中,如下所示(在配置中或使用自定义爬虫):

  • _团体
  • _小路
  • _创作者
  • 制造商
  • 尺寸
  • ... [其他领域]

创建一个表示结果的类

    public class MyThing
    {
        public string Manufacturer { get; set; }
        public string Size { get; set; }
        public int Year { get; set; }
        public MyThing(Document doc)
        {
            Manufacturer = doc.GetField("Manufacturer").Value;
            Size = doc.GetField("Size").Value;
            Year = int.Parse(doc.GetField("Year").Value);
        }
    }

然后获取您的主要搜索结果命中,实例化您的轻量级 POCO,并计算它。瞧,1 个查询!

int countForSomething = results.Count(result=>result.Size == "XL");

注意:我有点在脑海中写下了这段代码,但你明白了。我在 Lucene 中的索引上使用了这个过程,在 Sitecore 中的结果高达 700K+,没有太多问题。祝你好运先生!

于 2013-10-04T19:45:13.663 回答
0

升级到 sitecore 7 将为您提供开箱即用的方面。抽象在一个不错的 LINQ API 中,可让您从 Lucene 和 SOLR 切换(其他,如 ElasticSearch 即将推出)......

于 2013-11-25T14:57:57.920 回答
0

啊! 我自己刚刚解决了分面搜索和 CPU 使用率的问题。这是一些边界线的黑魔法编码和一些非常有创意的缓存。

我们找到了一种将 Solr 的分面查询实现到 Lucene 中的方法,天哪,天哪,结果出奇地快。

精简版:

  • 构建一个包含字典的静态类。Key:单个过滤器的唯一表示,Value:Lucene QueryFilter 对象生成的 BitArray。

    var queryFilter = new QueryFilter(filterBooleanQuery); var bits = queryFilter.Bits(indexReader); 结果[filter.ID.ToString()] = 位

  • 在后台定期异步构建此字典。我的大约 80k 文档的索引只用了大约 15 秒的时间来构建,但这足以让很多用户生气,所以以非阻塞的方式进行是至关重要的。

  • 使用按位逻辑查询此字典以找到表示您正在寻找的命中的结果 BitArray。

    var combo = facetDictionary[thisFilter.ID.ToString()] .And(facetDictionary[selectedFilter.ID.ToString()]);

长版: http: //www.devatwork.nl/articles/lucenenet/faceted-search-and-drill-down-lucenenet/

现在,我们的实现只是为了获取这些结果集的基数,但理论上您也可以使用这些位数组从索引中获取实际文档。

祝你好运!

于 2013-10-16T19:25:24.780 回答