2009-01-22 42 views
34
Dim qp1 As New QueryParser("filename", New StandardAnalyzer()) 
Dim qp2 As New QueryParser("filetext", New StandardAnalyzer()) 
. 
. 

Tôi đang sử dụng thư viện 'Lucene.Net' và có câu hỏi sau. Thay vì tạo hai đối tượng Số lần truy cập, có thể thực hiện tìm kiếm trên cả hai trường bằng cách sử dụng một đối tượng QueryParser duy nhất, do đó tôi chỉ có một đối tượng Số lần truy cập mang lại cho tôi tổng số điểm là: mỗi tài liệu?Làm cách nào để kết hợp nhiều trường trong QueryParser?

Trả lời

1

cho mỗi trường tạo truy vấn từ các queryparsers ở trên, sau đó thêm truy vấn vào một booleanquery nói rằng nó "phải" xảy ra.

Hoặc, hãy xem MultiFieldQueryParser, một cách đơn giản để thực hiện.

4

Chỉ cần xây dựng một chuỗi truy vấn với từng kỳ hạn:

"filename:searchText OR filetext:searchText" 

Nó không có vấn đề gì bạn vượt qua như lĩnh vực ban đầu trong constructor QueryParser của. Chỉ cần chắc chắn rằng bạn gọi .Parse() trên chuỗi truy vấn của bạn để có được một đối tượng Query để thực thi.

Nếu bạn muốn sử dụng một "và" tìm kiếm:

"+filename:searchText +filetext:searchText" 
77

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 QueryParsersee 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.

+1

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

+1

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

2

** bạn cũng có thể sử dụng MultiFieldQueryParser để tìm kiếm trong tất cả các trường có sẵn. **

ví dụ

Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, 
indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) 

ở đây là hoàn toàn một ví dụ.

//get index directory 
Dim directory As Directory = FSDirectory.Open(New DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))) 

//get analyzer 
Dim analyzer As Analyzer = New StandardAnalyzer(Version.LUCENE_29) 

//get index reader and searcher 
Dim indexReader__1 As IndexReader = IndexReader.Open(directory, True) 
Dim indexSearch As Searcher = New IndexSearcher(indexReader__1) 

//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method 
Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer) 
Dim query = queryParser.Parse(Criteria) 
Dim resultDocs As TopDocs = Nothing 

//perform search 
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc()) 
Dim hits = resultDocs.scoreDocs 

hy vọng rằng giúp

Các vấn đề liên quan