Lucene.Net + SimpleLucene Как использовать с таблицей данных - PullRequest
0 голосов
/ 11 февраля 2012

Я использую SimpleLucene v1.0 и Lucene.Net v2.9.2.2 .

Я пытался изменить пример SimpleLucene на datatable, но я не смог заставить его работать.

 static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("name");
            dt.Columns.Add("id");

             DataRow row = dt.NewRow();
             row["name"] = "Hi";
             row["id"] = 1;

             dt.Rows.Add(row);

            IEnumerable<DataTable> d = new List<DataTable>() { dt };



            // index location
            var indexPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Index");

            var indexWriter = new DirectoryIndexWriter(new DirectoryInfo(indexPath), true);

            using (var indexService = new IndexService(indexWriter))
            {
                var result = indexService.IndexEntities(d, new ProductIndexDefinition());
                Console.WriteLine("{0} products indexed in {1} milliseconds.", result.Count, result.ExecutionTime);

            }
            var indexSearcher = new DirectoryIndexSearcher(new DirectoryInfo(indexPath), true);
            using (var searchService = new SearchService(indexSearcher))
            {
                var query = new ProductQuery().WithKeywords("Hi");
                var result = searchService.SearchIndex(query.Query);
                foreach (var doc in result.Results)
                    Console.WriteLine(doc.GetValues("name").First());
                Console.ReadLine();
            }

        }


  public class ProductIndexDefinition : IIndexDefinition<DataTable>
    {
        public Document Convert(DataTable entity)
        {
            var document = new Document();
            document.Add(new Field("id", entity.Columns["id"].ColumnName, Field.Store.YES, Field.Index.NOT_ANALYZED));
            document.Add(new Field("name", entity.Columns["name"].ColumnName, Field.Store.YES, Field.Index.ANALYZED));
            return document;
        }

        public Term GetIndex(DataTable entity)
        {
            return new Term("id", entity.Columns["id"].ColumnName);
        }
    }


   public ProductQuery WithKeywords(string keywords)
        {
            if (!string.IsNullOrEmpty(keywords))
            {
                string[] fields = { "name"};
                var parser = new MultiFieldQueryParser(Version.LUCENE_29,
                    fields, new StandardAnalyzer(Version.LUCENE_29));
                Query multiQuery = parser.Parse(keywords);

                this.AddQuery(multiQuery);
            }
            return this;
        }

Я предполагаю, что что-то все еще не сконфигурировано правильно, не получите правильные значения.

...