Có 3 cách để làm điều này.
Cách đầu tiên là xây dựng truy vấn theo cách thủ công, đây là những gì QueryParser
đang thực hiện nội bộ. Đây là cách hiệu quả nhất để làm điều đó, và có nghĩa là bạn không cần phải phân tích đầu vào người sử dụng nếu bạn muốn ngăn chặn truy cập vào một số tính năng kỳ lạ hơn QueryParser
:
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("filename", "<text>"));
Query query2 = new TermQuery(new Term("filetext", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);
Cách thứ hai là để sử dụng MultiFieldQueryParser
, điều này hoạt động như QueryParser
, cho phép truy cập tất cả sức mạnh mà nó có, ngoại trừ việc nó sẽ tìm kiếm trên nhiều trường.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
new string[] {"filename", "filetext"},
analyzer);
Hits hits = searcher.Search(queryParser.parse("<text>"));
Cách cuối cùng là sử dụng cú pháp đặc biệt QueryParser
see here.
IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't
// prefix it with a field.
string special = "filename:" + text + " OR filetext:" + text;
Hits hits = searcher.Search(queryParser.parse(special));
tùy chọn khác của bạn là tạo ra lĩnh vực mới khi bạn chỉ mục nội dung của bạn được gọi filenameandtext, vào đó bạn có thể đặt nội dung của cả tên tập tin và filetext, sau đó bạn chỉ phải tìm kiếm một lĩnh vực.
Nguồn
2010-01-10 11:54:34
với MultiFieldQueryParser, làm thế nào nên truy vấn như thế nào? Bạn có thể đưa ra một ví dụ cho "" trong dòng 'queryParser.parse (" ")'? –
alvas
làm cách nào để tôi cho phép truy vấn cho các trường khác nhau bằng MultiFieldQueryParser? giả sử tôi muốn truy vấn 'filename: testfile.txt AND filetext:" Singapore food "'. – alvas