Lucene — поиск поля числового значения

#c# #search #lucene #lucene.net

#c# #Поиск #lucene #lucene.net

Вопрос:

хорошо, я искал это в течение последних двух часов с результатами, которые дают только подсказки, и даже не один полный код для спасения (как новички узнают, если они не видят некоторые образцы ?)

я создал индекс следующим образом:

 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);
  

результатов не возвращает.
я читал о NumericRange KeywordAnalyzer и еще о некоторых вещах,
но поскольку ни один из них не предоставляет образец, я не мог понять, как это сделать.

пожалуйста, добрые люди, дайте мне пример того, как заставить эту вещь работать.

Ответ №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, поэтому хотелось бы узнать, есть ли лучший подход.

Комментарии:

1. Если вы просто ищете один int , вам не нужно искать по диапазону. Просто используйте это: запрос TermQuery = новый TermQuery(новый термин(«TaxonRankSortOrder», NumericUtils. IntToPrefixCoded(3000)));

Ответ №2:

Изменить Field.Index.NO на Field.Index.ANALYZED (или Field.Index.NOT_ANALYZED ) в поле ID