[英]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.