【问题标题】:Get total record count in Lucene or SQL SERVER Full Text Search获取 Lucene 或 SQL SERVER 全文搜索中的总记录数
【发布时间】:2013-05-15 00:48:49
【问题描述】:

我有一个名为Tags 的表。在这张表中,我有一个ID,一个tag name。 当用户在网页文本框中输入一些prefix words 时,我想按组查找总记录数。 与 stackoverflow.com 相同。

当用户输入"sql" word 时,结果如下:

【问题讨论】:

    标签: sql-server lucene full-text-search lucene.net


    【解决方案1】:

    从一个 Lucene 索引中,可以得到包含一个词条的文档的数量(docfreq),使用IndexReader.docfreq,如:

    reader.docfreq("tags", new BytesRef("sql"));
    

    这需要精确的术语值(无通配符)。您应该正常执行通配符搜索,并如上所述为显示的每个结果调用 docfreq。

    【讨论】:

      【解决方案2】:

      类似的东西会起作用。请注意,在大型索引上,前导通配符可能非常很慢。

      RAMDirectory dir = new RAMDirectory();
      IndexWriter iw = new IndexWriter(dir, new KeywordAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
      
      Document d = new Document();
      Field f = new Field("tag", "", Field.Store.YES, Field.Index.ANALYZED);
      d.Add(f);
      
      f.SetValue("sql");
      iw.AddDocument(d);
      f.SetValue("mysql");
      iw.AddDocument(d);
      f.SetValue("sql-server");
      iw.AddDocument(d);
      f.SetValue("sql-server");
      iw.AddDocument(d);
      f.SetValue("sql-server");
      iw.AddDocument(d);
      f.SetValue("c#");
      iw.AddDocument(d);
      f.SetValue("java");
      iw.AddDocument(d);
      f.SetValue("java");
      iw.AddDocument(d);
      
      iw.Commit();
      IndexReader reader = iw.GetReader();
      Console.WriteLine("Tags containing sql");
      using (FilteredTermEnum termEnum = new WildcardTermEnum(reader, new Term("tag", "*sql*")))
      {
          do
          {
              if (termEnum.Term != null)
                  Console.WriteLine(termEnum.Term.Text + ":" + reader.DocFreq(termEnum.Term));
          }
          while (termEnum.Next());
      }
      Console.WriteLine("\nTags containing java");
      using (FilteredTermEnum termEnum = new WildcardTermEnum(reader, new Term("tag", "*java*")))
      {
          do
          {
              if (termEnum.Term != null)
                  Console.WriteLine(termEnum.Term.Text + ":" + reader.DocFreq(termEnum.Term));
          }
          while (termEnum.Next());
      }
      reader.Dispose();
      iw.Dispose();
      

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 2011-10-12
        • 2017-05-18
        • 2011-04-02
        相关资源
        最近更新 更多