繁体   English   中英

使用Lucene在许多字段中搜索

[英]Search within many fields with Lucene

如何使用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;

我发现 :

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM