【问题标题】:RavenDb : Search occurrences in text is slowRavenDb:文本中的搜索出现速度很慢
【发布时间】:2014-01-18 19:13:08
【问题描述】:

我想查找文本中某个单词的出现次数。 我有这样的课

public class Page
{
    public string Id { get; set; }
    public string BookId { get; set; }
    public string Content { get; set; }
    public int PageNumber { get; set; }
}

我的索引是这样的:

class Pages_SearchOccurrence : AbstractIndexCreationTask<Page, Pages_SearchOccurrence.ReduceResult>
{
    public class ReduceResult
    {
        public string PageId { get; set; }
        public int Count { get; set; }
        public string Word { get; set; }
        public string Content { get; set; }
    }

    public Pages_SearchOccurrence()
    {
        Map = pages => from page in pages
                       let words = page.Content
                                       .ToLower()
                                       .Split(new string[] { " ", "\n", ",", ";" }, StringSplitOptions.RemoveEmptyEntries)
                       from w in words
                       select new
                       {
                           page.Content,
                           PageId = page.Id,
                           Count = 1,
                           Word = w
                       };


        Reduce = results => from result in results
                            group result by new { PageId = result.PageId, result.Word } into g
                            select new
                            {
                                Content = g.First().Content,
                                PageId = g.Key.PageId,
                                Word = g.Key.Word,
                                Count = g.ToList().Count()
                            };

        Index(x => x.Content, Raven.Abstractions.Indexing.FieldIndexing.Analyzed);
    }
}

最后,我的查询是这样的:

    using (var session = documentStore.OpenSession())
            {
                RavenQueryStatistics stats;
                var occurence = session.Query<Pages_SearchOccurrence.ReduceResult, Pages_SearchOccurrence>()
                    .Statistics(out stats)
                    .Where(x => x.Word == "works")
                    .ToList();


            }

但我意识到 RavenDb 很慢(或者我的查询不好) stats.IsStale = true 并且 raven studio 花费了太多时间并且只给出很少的结果。 我有 1000 个文档“页面”,每页内容为 1000 个单词。 为什么我的查询不正确,我如何在页面中找到这些事件? 感谢您的帮助!

【问题讨论】:

标签: ravendb


【解决方案1】:

你做错了。您应该将 Content 字段设置为已分析并使用 RavenDB 的 Search() 运算符。速度很慢很可能是因为您的索引代码正在执行大量未优化的工作。

【讨论】:

    【解决方案2】:

    我找到了部分结果。

    也许我不清楚:我的目标是找到页面中某个单词的出现次数。 我在页面中搜索一个单词的点击数,我想按这个数排序。

    我这样改变了我的索引:

     class Pages_SearchOccurrence : AbstractIndexCreationTask<Page, Pages_SearchOccurrence.ReduceResult>{
    
     public class ReduceResult
        {
            public string Content { get; set; }
            public string PageId { get; set; }
            public string Count { get; set; }
            public string Word { get; set; }
        }
    
         public Pages_SearchOccurrence()
        {
            Map = pages => from page in pages
                           let words = page.Content.ToLower().Split(new string[] { " ", "\n", ",", ";" }, StringSplitOptions.RemoveEmptyEntries)
                           from w in words
                           select new
                           {
                               page.Content,
                               PageId = page.Id,
                               Count = 1,
                               Word = w
                           };
    
            Index(x => x.Content, Raven.Abstractions.Indexing.FieldIndexing.Analyzed);
            Index(x => x.PageId, Raven.Abstractions.Indexing.FieldIndexing.NotAnalyzed);
        }
    

    最后,我的新查询如下所示:

      using (var session = documentStore.OpenSession())
                {
    
                    var query = session.Query<Pages_SearchOccurrence.ReduceResult, Pages_SearchOccurrence>()
                       .Search((x) => x.Word, "works")
                       .AggregateBy(x => x.PageId)
                       .CountOn(x => x.Count)
                       .ToList()
                       .Results
                       .FirstOrDefault();
    
                     var listFacetValues = query.Value.Values;
                     var finalResult = listFacetValues.GroupBy(x => x.Hits).OrderByDescending(x => x.Key).Take(5).ToList();
    
    
                }
    

    finalResult 给了我一组具有 Hits

    属性的 Facetvalue

    (这里我的FacetValue的属性HitsCount是一样的)

    Hits 属性给了我想要的结果,但对我来说,这段代码不正确,而且 ravendb studio 也不喜欢这样。

    你有更好的解决方案吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 2022-11-10
      • 1970-01-01
      • 2012-06-03
      • 2016-03-12
      • 2011-10-16
      • 1970-01-01
      • 2012-12-17
      相关资源
      最近更新 更多