【问题标题】:Search within many fields with Lucene使用 Lucene 在多个领域内搜索
【发布时间】:2013-11-29 18:08:12
【问题描述】:

如何使用 Lucene 在多个字段中进行搜索?

我可以根据一个字段或所有字段进行搜索。但在几个字段内不能。

我的代码:

  public class Users
    {
        public string Name { get; set; }
        public string Family { get; set; }
        public string Code { get; set; }
    }

搜索字段:

List<Users> searchResults = GoLucene<Users>.Search(input, "Family").ToList();

搜索所有字段:

List<Users> searchResults = GoLucene<Users>.Search(input).ToList();


public static IEnumerable<T> Search(string input, string fieldName = "")
        {
            if (string.IsNullOrEmpty(input)) return new List<T>();
            return _search(input, fieldName);
        }

        // main search method
        private static IEnumerable<T> _search(string searchQuery, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", ""))) return new List<T>();

            // set up lucene searcher
            using (var searcher = new IndexSearcher(Directory, true))
            {
                const int hitsLimit = 15000;
                var analyzer = new StandardAnalyzer(Version.LUCENE_30);
                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                     var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    var query = ParseQuery(searchQuery, parser);
                    var hits = searcher.Search(query, hitsLimit).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var strings = ReadProperties().Select(a => a.Name).ToArray();
                    var parser = new MultiFieldQueryParser(Version.LUCENE_30, strings, analyzer);
                    var query = ParseQuery(searchQuery, parser);
                    var hits = searcher.Search(query, null, hitsLimit, Sort.INDEXORDER).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;
                }
            }

        }

如何仅在以下字段中进行搜索? 家庭,代码

我尝试了以下方法,但没有成功:

List<Users> searchResults = GoLucene<Users>.Search(input, "Family,Code").ToList();

或

List<Users> searchResults = GoLucene<Users>.Search(input, "Family||Code").ToList();

或

List<Users> searchResults = GoLucene<Users>.Search(input, "Family Code").ToList();

更新: 我尝试了以下方法,但没有成功:

                    var nameParser = new QueryParser(Version.LUCENE_30, "Family", analyzer);
                    var hobbiesParser = new QueryParser(Version.LUCENE_30, "Code", analyzer);

                    var q = new BooleanQuery
                    {
                        {nameParser.Parse(searchQuery), Occur.SHOULD},
                        {hobbiesParser.Parse(searchQuery), Occur.SHOULD}
                    };

                    var hits = searcher.Search(q, null, hitsLimit, Sort.INDEXORDER).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;

更新 2: 我尝试了以下方法,但没有成功:

   var queryParser = new MultiFieldQueryParser(
                        Version.LUCENE_30,
                        new[] {"Family", "Code"},analyzer);
                    Query query = queryParser.Parse(searchQuery);
                    var hits = searcher.Search(query, hitsLimit).ScoreDocs;
                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return results;

【问题讨论】:

    标签: c# search lucene


    【解决方案1】:

    我找到了:

    var searchField="Family,Code";
    var parser = new MultiFieldQueryParser(Version.LUCENE_30, searchField.Split(','), analyzer);
    var query = ParseQuery(searchQuery, parser);
    var hits = searcher.Search(query, null, hitsLimit, Sort.INDEXORDER).ScoreDocs;
    var results = _mapLuceneToDataList(hits, searcher);
    analyzer.Close();
    searcher.Dispose();
    return results;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2010-10-16
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多