2013-03-02 38 views
14

Trong Lucene, chúng ta có thể sử dụng TermQuery để tìm kiếm một văn bản với một trường. Tôi tự hỏi làm thế nào để tìm kiếm một từ khóa trên một loạt các lĩnh vực hoặc tất cả các lĩnh vực tìm kiếm?Cách tìm kiếm trên tất cả các trường?

Trả lời

9

Hai phương pháp tiếp cận

1) cách tiếp cận Index thời gian: Sử dụng một-tất cả bắt lĩnh vực . Điều này không là gì ngoài việc thêm tất cả văn bản từ tất cả các trường (tổng văn bản từ tài liệu đầu vào của bạn) và vị trí dẫn đến văn bản lớn trong một trường đơn lẻ. Bạn đã thêm một trường bổ sung trong khi lập chỉ mục hoạt động như một trường nhận toàn bộ.

2) Phương pháp tiếp cận thời gian tìm kiếm: Sử dụng BooleanQuery để kết hợp nhiều truy vấn, ví dụ như các cá thể TermQuery. Có thể tạo nhiều truy vấn đó để bao gồm tất cả các trường mục tiêu.

Example kiểm tra ở cuối bài viết.

Sử dụng phương pháp 2 nếu bạn biết danh sách trường mục tiêu khi chạy. Nếu không, bạn phải sử dụng cách tiếp cận thứ nhất.

+0

Cám ơn tốt giải thích bức tranh lớn. Cách tiếp cận đầu tiên là những gì tôi sử dụng khi lưu trữ các loại sản phẩm khác nhau trong cùng một chỉ mục, ví dụ: Máy in so với Màn hình, nơi có các trường khác nhau cho mỗi tài liệu nhưng tôi muốn sử dụng tìm kiếm "toàn văn" bằng chuỗi tìm kiếm đơn giản và mang lại tất cả sản phẩm phù hợp. – nothingisnecessary

20

Cách tiếp cận khác, không yêu cầu lập chỉ mục bất cứ điều gì nhiều hơn những gì bạn đã có, cũng như không kết hợp các truy vấn khác nhau, đang sử dụng MultiFieldQueryParser.

Bạn có thể cung cấp danh sách các trường mà bạn muốn tìm kiếm và truy vấn của bạn, đó là tất cả.

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
       Version.LUCENE_41, 
       new String[]{"title", "content", "description"}, 
       new StandardAnalyzer(Version.LUCENE_41)); 

Query query = queryParser.parse("here goes your query"); 

Đây là cách tôi làm với thư viện gốc lucene được viết bằng Java. Tôi không chắc liệu MultiFieldQueryParser cũng có sẵn trong lucene.net hay không.

+0

MultiFieldQueryParser là một cách tiếp cận thanh lịch .. :) – phani

+0

Cảm ơn, câu trả lời của bạn cũng không tệ;) +1 – javanna

3

Một cách tiếp cận dễ dàng khác để tìm kiếm trên tất cả các trường sử dụng "MultifieldQueryParser" đang sử dụng IndexReader.FieldOption.ALL trong truy vấn của bạn.

Đây là ví dụ trong C#.

Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath))); 

    //get analyzer 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); 

    //get index reader and searcher 
    IndexReader indexReader__1 = IndexReader.Open(directory, true); 
    Searcher indexSearch = new IndexSearcher(indexReader__1); 

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

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

click here kiểm tra câu trả lời dể qua tôi để cùng quesiton trong vb.net

+0

Tôi không thấy điểm sử dụng cách gõ vịt ở đây (nghĩa là từ khóa 'động'). Có lẽ bạn muốn sử dụng loại interence với 'var'? –

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