【问题标题】:RavenDB full-text searchRavenDB 全文搜索
【发布时间】:2011-05-17 21:43:07
【问题描述】:

您能告诉我如何在 RavenDb 中执行简单的全文搜索。数据库存储文档:Movie {Name = "Pirates of the Carribean"}。我希望在搜索短语“加勒比海盗”或任何其他单词组合中找到此文档。

【问题讨论】:

    标签: search ravendb full-text-search


    【解决方案1】:

    鲍里斯, Rob 的答案有正确的索引,但是查询起来有点尴尬。你可以这样做:

     session.Query<Movie, Movie_ByName>()
             .Search(x=>x.Name, searchTerms)
             .ToList()
    

    那会

    【讨论】:

    • @RonnieOverby 那是他被熊吃掉的那一刻。
    【解决方案2】:

    您担心的与全文无关 - 默认情况下,Lucene 在 OR 基础上工作,而您想要的是 AND

    如果我是你,我会这样做

     String[] terms = searchTerm.Split(" "); // Or whatever the string.split method is
    

      .Where("Name:(" + String.Join(" AND ", terms) + ")");
    

    您的索引应该类似于

     public class Movie_ByName : AbstractIndexCreationTask
     {
        public override IndexDefinition CreateIndexDefinition()
        {
            return new IndexDefinitionBuilder<Movie>
                       {
                           Map = movies => from movie in movies
                                            select new { movie.Name, market.Id },
    
                           Indexes =
                               {
                                   {x => x.Name, FieldIndexing.Analyzed}
                               }
                       }
                .ToIndexDefinition(DocumentStore.Conventions);
        }
    

    您不需要存储,任何时候都不会直接从 lucene 请求数据。您甚至可能不需要索引(您可能实际上需要 FieldIndexing.Analyzed,并且可能只在此处使用动态查询就可以逃脱)

    由你决定。

    【讨论】:

    • 或 searchTerm.Replace(" ", " AND "),尽管您可能希望对空条目等保持警惕。
    • 市场/市场文本是否会从复制粘贴中遗留下来?
    • 是的,我以另一个问题为例
    • 电影变量从何而来?
    【解决方案3】:

    这是我实现“ANDing”字词搜索的方法。

    首先,确保您的字段已被索引和分析:

    public class MyIndex: AbstractIndexCreationTask<MyDocument>
    {
        public MyIndex()
        {
            Map = docs => from d in docs
                          select new { d.MyTextField  };
    
            Index(x => x.MyTextField, FieldIndexing.Analyzed);
        }
    }
    

    然后从客户端查询:

       var query = session.Query<MyDocument, MyIndex>();
    
        query = theSearchText
                    .Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries)
                    .Aggregate(query, (q, term) =>
                         q.Search(x => x.MyTextField, term, options: SearchOptions.And));
    

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多