【问题标题】:Lucene - searching for a numeric value fieldLucene - 搜索数值字段
【发布时间】:2011-12-13 13:28:45
【问题描述】:

好的,我在过去两个小时内搜索了这个,结果只给出了提示, 甚至没有一个完整的代码来拯救(如果他们看不到一些样本,菜鸟将如何学习?)

我已经创建了一个这样的索引:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels/")));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
IndexWriter writer = new IndexWriter(directory, analyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.Add(new Field("ID", "0", Field.Store.YES, Field.Index.NO));
doc.Add(new Field("parentID", "0", Field.Store.YES, Field.Index.NO));
doc.Add(new Field("Title", "Root", Field.Store.YES, Field.Index.ANALYZED));
writer.AddDocument(doc);
writer.Optimize();
writer.Close();

现在,我想搜索字段ID,其中值等于0(获取我在那里的单条记录)....

但是,像这样的简单搜索:

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(Server.MapPath("/data/channels")));
Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Version.LUCENE_29);
Searcher searcher = new Lucene.Net.Search.IndexSearcher(IndexReader.Open(directory, true));
Query query = new Lucene.Net.QueryParsers.QueryParser(Version.LUCENE_29, "ID", analyzer).Parse("0");
Hits hits = searcher.Search(query);

不返回任何结果。 我读过关于NumericRangeKeywordAnalyzer 和更多的东西, 但由于他们都没有提供样本,我不知道该怎么做。

请好心人,给我举个例子说明如何使这件事发挥作用。

【问题讨论】:

    标签: c# search lucene lucene.net


    【解决方案1】:

    我使用 NumericField 和 NumericRangeQuery 来搜索 Lucene 索引中的数字。

    创建索引时:

      NumericField taxonRankSortOrder = new NumericField("TaxonRankSortOrder", Field.Store.YES, true);
      taxonRankSortOrder.SetIntValue(rank);
      document.Add(taxonRankSortOrder);
    

    然后使用查询:

      NumericRangeQuery query = NumericRangeQuery.NewIntRange("TaxonRankSortOrder", 3000, 3000, true, true);
    

    将返回 TaxonRankSortOrder 等于 3000 的所有文档。

    您必须自己创建查询,而不是使用 QueryParser,因此很想看看是否还有更好的方法。

    【讨论】:

    • 如果您只是搜索单个 int,则不需要按范围搜索。简单地使用这个: TermQuery query = new TermQuery(new Term("TaxonRankSortOrder", NumericUtils.IntToPrefixCoded(3000)));
    【解决方案2】:

    在 ID 字段中将 Field.Index.NO 更改为 Field.Index.ANALYZED(或 Field.Index.NOT_ANALYZED

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多