2008-08-19 24 views
10

Tôi sử dụng solr để tìm kiếm tài liệu và khi tìm kiếm tài liệu bằng truy vấn này "id:*", tôi nhận được ngoại lệ phân tích cú pháp truy vấn này nói rằng nó không thể phân tích truy vấn bằng * hoặc? là nhân vật đầu tiên.Lỗi WildcardQuery trong Solr

HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery 

type Status report 

message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery 

description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery). 

Có bản vá nào để làm việc này chỉ với * không? Hoặc là rất tốn kém để làm một truy vấn như vậy?

Trả lời

1

Tôi giả sử với id: * bạn chỉ đang cố gắng khớp tất cả tài liệu, đúng không?

Trước đây tôi chưa bao giờ sử dụng solr, nhưng trong kinh nghiệm Lucene, khi nhập dữ liệu, chúng tôi đã thêm một trường ẩn vào mọi tài liệu, sau đó khi chúng tôi cần trả về mỗi bản ghi, chúng tôi thực hiện tìm kiếm chuỗi liên tục trường đó giống nhau đối với mọi bản ghi.

Nếu bạn không thể thêm trường như thế trong trường hợp của mình, bạn có thể sử dụng RegexQuery với regex khớp với bất kỳ thứ gì có thể tìm thấy trong trường id.

Chỉnh sửa: thực sự trả lời câu hỏi. Tôi đã không bao giờ nghe nói về một bản vá để có được điều đó để làm việc, nhưng tôi sẽ ngạc nhiên nếu nó thậm chí có thể được thực hiện để làm việc khá tốt. Xem this question vì lý do tại sao PrefixQuery không bị giới hạn có thể gây ra sự cố.

1

Thực ra, tôi đã sử dụng giải pháp cho việc này. Tôi thêm một nhân vật để id, ví dụ: A1, A2, vv

Với giá trị như vậy trong lĩnh vực này, người ta có thể tìm kiếm bằng cách sử dụng truy vấn id:A*

Nhưng rất thích để tìm xem một giải pháp thực sự tồn tại .

6

Lucene không cho phép bạn khởi động WildcardQueries với dấu hoa thị theo mặc định, vì đó là các truy vấn cực kỳ tốn kém và sẽ rất, rất, rất chậm trên các chỉ mục lớn.

Nếu bạn đang sử dụng Lucene QueryParser, hãy gọi setAllowLeadingWildcard (true) trên đó để bật nó.

Nếu bạn muốn tất cả các tài liệu có một bộ trường nhất định, bạn tốt hơn nhiều khi truy vấn hoặc đi bộ lập chỉ mục bằng cách sử dụng QueryParser. Bạn thực sự chỉ nên sử dụng QueryParser để phân tích đầu vào của người dùng.

5
id:[a* TO z*] id:[0* TO 9*] etc. 

Tôi chỉ làm điều này trong lukeall trên chỉ mục của mình và nó hoạt động, do đó nó sẽ hoạt động trong Solr, sử dụng trình phân tích truy vấn chuẩn. Tôi không thực sự sử dụng Solr.

Trong cơ sở Lucene có lý do chính đáng tại sao bạn không bao giờ truy vấn cho mọi tài liệu, đó là do truy vấn tài liệu bạn phải sử dụng new indexReader("DirectoryName") và áp dụng truy vấn cho nó. Do đó, bạn hoàn toàn có thể bỏ qua việc áp dụng truy vấn cho nó và sử dụng các phương thức indexReadernumDocs() để nhận tổng số tài liệu và document(int n) để truy xuất bất kỳ tài liệu nào.

14

Nếu bạn muốn tất cả các văn bản, thực hiện truy vấn trên *: *

Nếu bạn muốn tất cả tài liệu với một lĩnh vực nhất định (ví dụ id) thử id: [* ĐẾN *]

4

Nếu bạn chỉ là cố gắng lấy tất cả các tài liệu, Solr không hỗ trợ truy vấn *: *. Đó là lần duy nhất tôi biết Solr sẽ cho phép bạn bắt đầu một truy vấn với dấu *.Tôi chắc rằng bạn đã có thể nhìn thấy điều này như là truy vấn mặc định trong trang quản trị Solr.

Nếu bạn đang cố gắng thực hiện truy vấn cụ thể hơn với ký tự đầu tiên, như id: * 456 thì một trong những cách tốt nhất tôi đã thấy là lập chỉ mục trường đó hai lần. Một lần bình thường (tên trường: id), và một lần với tất cả các ký tự được đảo ngược (tên trường: reverse_id). Sau đó, về cơ bản bạn có thể thực hiện id truy vấn: 456 bằng cách gửi truy vấn reverse_id: 654 thay thế. Hy vọng rằng có ý nghĩa.

Bạn cũng có thể tìm kiếm danh sách gửi thư của nhóm người dùng Solr tại http://www.mail-archive.com/[email protected]/ nơi các câu hỏi như thế này xuất hiện khá thường xuyên.

2

Vấn đề Solr sau đây là yêu cầu để có thể định cấu hình trình phân tích cú pháp truy vấn lucene mặc định. https://issues.apache.org/jira/browse/SOLR-218

Trong số này bạn có thể tìm thấy mô tả sau đây về cách 'vá' Solr. Sửa đổi này sẽ cho phép bạn bắt đầu truy vấn bằng dấu *.

Jonas Salk: Về cơ bản tôi đã cập nhật chỉ một tệp Java: SolrQueryParser.java.

public SolrQueryParser(IndexSchema schema, String defaultField) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
} 

... 

public SolrQueryParser(QParser parser, String defaultField, Analyzer analyzer) { 
    ... 
    setAllowLeadingWildcard(true); 
    setLowercaseExpandedTerms(true); 
    ... 
} 

Tôi không chắc chắn nếu setLowercaseExpandedTerms là cần thiết ...

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