2012-04-06 39 views
6

Tôi hơi bối rối khi cố gắng thiết lập tìm kiếm bằng cách sử dụng tìm kiếm toàn văn trong chế độ boolean. Dưới đây là các truy vấn Tôi đang sử dụng:Tìm kiếm toàn văn MySQL Bối rối chế độ Boolean

$query = "SELECT *, 

     MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score 

     FROM results 

     WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE) 

     ORDER BY score DESC"; 

Khi tôi chạy tìm kiếm +divorce+refinance, kết quả trả về là:

1) Divorce: Paying Off Spouse = Rate/Term Refinance 
2) Divorce - What to Look Out For Regarding Divorced Borrowers 

Tôi có ngay trong suy nghĩ rằng kết quả thứ hai không nên xuất hiện, vì nó không có cả hai từ? Nếu không, làm thế nào tôi có thể tạo ra chức năng đó?

Trả lời

9

Có thể tôi đã nhầm lẫn, nhưng nếu bạn tìm kiếm chuỗi này +divorce+refinance bạn sẽ nhận được kết quả lạ. Nếu bạn muốn tìm kiếm cả hai từ, bạn nên tìm kiếm +divorce +refinance (với khoảng cách giữa).

Tôi đã thử nghiệm nó và nó chỉ trả về một hàng:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

Vấn đề của bạn liên quan đến việc tạo ra một truy vấn boolean ưu tiên và cho loại hình này của một truy vấn phải đi sâu tìm kiếm Boolean và đến nay như thế nào tìm kiếm Boolean được thực hiện. Nói một cách đơn giản, hãy để tôi giải thích cho bạn tại sao kết quả số thứ hai của kết quả được hiển thị.

Trước tiên, hãy hiểu ý nghĩa của Boolean trong lập trình? Điều đó có nghĩa là điều kiện là đúng hoặc sai i, e 0 đến 1.

Bây giờ hãy để tôi giải thích cho tìm kiếm Boolean được thực hiện? Bạn đã đưa ra hai từ. Hãy để chúng tôi tìm kiếm hàng theo hàng trong chế độ Boolean. Công cụ tìm kiếm bắt đầu và tìm kiếm hàng theo hàng ngay bây giờ, nơi từ đầu tiên được tìm thấy, nó làm cho bản ghi đúng và cho điểm là 1 đến các hàng trong đó từ đầu tiên được tìm thấy và cũng chuẩn bị số từ tìm thấy trong hàng.

Bây giờ nó di chuyển từ tiếp theo và thực hiện quy trình tương tự cho bản ghi True và tạo danh sách các bản ghi ở bất cứ nơi nào tìm thấy từ và cũng chuẩn bị số từ tìm thấy trong hàng.

Bây giờ có hai hàng kết quả có sẵn và chúng được đặt câu lạc bộ và ưu tiên cho các từ có số lượng từ và hàng tối đa ở đây là vấn đề chính nằm.

Ví dụ

Đầu tiên >>> tổng nos. >> Thứ hai >> tổng số. >>> cuối cùng >> hàng
Lời >>> Kết quả >> Lời >>>> các từ>>> Kết quả >> không >> trả lời


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1.25 >>>> 3 >>> 1

Khi gắn kết hai kết quả liệt kê khi thêm đúng với sai thì kết quả là đúng, như thể bạn thêm 1 + 0 = 1 và kết quả là shoul d với giá trị lớn hơn 1. Vì vậy, trong khi chấm điểm phù hợp với các từ tìm thấy nó luôn luôn được tìm thấy rằng công cụ tìm kiếm cho thấy kết quả mà nó tìm thấy bất kỳ từ nào.

Việc chấm điểm truy vấn liên quan được thực hiện theo hai loại hoặc bỏ qua các điểm bằng một và chỉ tính toán trên hồ sơ có điểm số lớn hơn 1. Thứ hai là thực hiện truy vấn đó mà không bao giờ hiển thị các bản ghi bằng một. Như trong trường hợp của bạn, bạn có thể để những điều dưới đây cũng để có được kết quả chính xác cho hai từ:

SELECT *, ((1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE)))) AS score FROM results WHERE (MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE)) HAVING relevance > 0 ORDER BY relevance DESC; 

Tôi biết rằng việc sử dụng các từ HAVING làm cho truy vấn chút chậm nhưng không có giải pháp khác có sẵn. Hy vọng điều này sẽ giải quyết truy vấn của bạn.

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