2009-11-07 8 views
5

ví dụ tôi cần phải tạo ra một cái gì đó như google phân tích cú pháp truy vấn tìm kiếm để phân tích các biểu hiện như:làm thế nào để tạo ra một phân tích cú pháp cho truy vấn tìm kiếm

bay hiking hay swiming - "** đi bộ trong khởi động **" ** tác giả: ** Hamish ** tác giả: ** reid

hoặc

nhà trong new york giá trên 500000 $ với một hồ bơi

làm thế nào tôi sẽ thậm chí đi về bắt đầu xây dựng một cái gì đó giống như nó? bất kỳ tài nguyên tốt nào?

C# có liên quan, xin vui lòng (nếu có thể)

  • chỉnh sửa: đây là một cái gì đó mà tôi bằng cách nào đó sẽ có thể dịch cho một truy vấn sql

Trả lời

5

Bạn có bao nhiêu từ khóa (như 'hoặc', 'trong', 'có giá trên', 'có')? Nếu bạn chỉ có một vài người trong số họ tôi muốn đề nghị đi với xử lý chuỗi đơn giản (regexes) quá.

Nhưng nếu bạn có nhiều hơn thế, bạn có thể muốn xem xét triển khai trình phân tích cú pháp thực cho các biểu thức tìm kiếm đó. Irony.net có thể giúp bạn với điều đó (tôi thấy nó cực kỳ dễ sử dụng khi bạn có thể diễn đạt ngữ pháp của bạn trong một hình thức bnf gần trực tiếp trong mã).

+0

có tiềm năng hàng trăm từ khóa, tuy nhiên không phải tất cả đều được yêu cầu cùng một lúc. – b0x0rz

+0

Đó không phải là một vấn đề dễ giải quyết khi bạn phải gán một 'ý nghĩa' cho hàng trăm từ khóa đó. Và tôi tự hỏi lược đồ cơ sở dữ liệu của bạn trông như thế nào? – andyp

+0

Liên kết tuyệt vời cho Irony.net, +1 – SRKX

-1

tôi nghĩ rằng bạn chỉ nên làm một số xử lý chuỗi. Không có cách thông minh để làm điều này.

Vì vậy hãy thay thế "HOẶC" bằng toán tử hoặc của riêng bạn (ví dụ: ||). Theo tôi biết không có thư viện cho việc này.

Tôi đề nghị bạn nên sử dụng regexes.

1

Dự án Lucene/NLucene có chức năng cho các truy vấn boolean và một số định dạng truy vấn khác. Tôi không biết về khả năng thêm tiện ích mở rộng riêng như tác giả trong trường hợp của bạn, nhưng có thể đáng để kiểm tra.

1

Có vài cách làm việc đó, hai trong số họ:

  • Parsing sử dụng grammar (hữu dụng cho ngôn ngữ phức tạp)
  • Parsing sử dụng regular expression và cơ bản chuỗi thao tác (đối với ngôn ngữ đơn giản hơn)

Theo ví dụ của bạn, ngôn ngữ rất cơ bản để tách chuỗi theo từ khóa có thể là giải pháp tốt nhất.

string sentence = "house in new york priced over $500000 with a swimming pool"; 
string[] values = sentence.Split(new []{" in ", " priced over ", " with a "}, 
           StringSplitOptions.None); 
string type = values[0]; 
string area = values[1]; 
string price = values[2]; 
string accessories = values[3]; 

Tuy nhiên, một số vấn đề có thể phát sinh là: làm thế nào để kiểm tra xem câu đứng theo hình thức dự kiến? Điều gì sẽ xảy ra nếu một số từ khóa có thể xuất hiện như một phần của các giá trị?

Nếu đây là trường hợp bạn gặp phải có một số thư viện bạn có thể sử dụng để phân tích đầu vào bằng cách sử dụng ngữ pháp đã xác định. Hai trong số các thư viện này hoạt động với .Net là ANTLRGold Parser, cả hai đều miễn phí. Thách thức chính là xác định ngữ pháp.

+0

thích GOLD cho đến nay tốt nhất. – b0x0rz

1

Ngữ pháp sẽ hoạt động rất tốt cho ví dụ thứ hai bạn đưa ra nhưng đầu tiên (bất kỳ từ khóa/chuỗi lệnh nào) sẽ được xử lý tốt nhất bằng cách sử dụng Split() và một lớp để xử lý các từ khóa và lệnh khác nhau. Bạn sẽ phải thực hiện xử lý ban đầu để xử lý các vùng được trích dẫn trước khi chia nhỏ (ví dụ thay thế các khoảng trống trong các vùng được trích dẫn bằng ký tự hiếm/không sử dụng).

Lệnh ":" dễ tìm và rút ra khỏi chuỗi tìm kiếm để xử lý sau khi quá trình chia tách hoàn tất. Chỉ cần duyệt qua mảng tìm kiếm.

Từ khóa +/- cũng dễ tìm và thêm vào truy vấn sql dưới dạng mệnh đề AND/AND NOT.

Nơi duy nhất bạn có thể gặp phải sự cố là "hoặc" vì bạn sẽ phải xác định cách xử lý. Điều gì xảy ra nếu có nhiều "hoặc"? Nhưng thứ tự của các từ khóa trong mảng cũng giống như trong truy vấn để không phải là một vấn đề.