2009-02-25 25 views
8

Vì vậy, tôi cần tìm hiểu cách thực hiện tìm kiếm boolean toàn văn trên cơ sở dữ liệu MySQL để trả về một bản ghi có chứa từ "C++".Làm thế nào để bạn có được tìm kiếm boolean Fulltext của bạn để chọn thuật ngữ C++?

Tôi có chuỗi tìm kiếm SQL của tôi là:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ("C++" IN BOOLEAN MODE) 

Mặc dù tất cả các lĩnh vực của tôi chứa chuỗi C++, nó không bao giờ quay trở lại trong các kết quả tìm kiếm.

Làm cách nào để sửa đổi MySQL để phù hợp với điều này? Có thể không? Giải pháp duy nhất tôi tìm thấy là thoát khỏi ký tự + trong quá trình nhập dữ liệu của tôi dưới dạng "__plus" và sau đó sửa đổi tìm kiếm của tôi thành chỗ ngồi, nhưng điều này có vẻ rườm rà và phải có cách tốt hơn .

+0

Tìm kiếm Boolean toàn văn là gì? Nghe có vẻ khủng khiếp rất nhiều như bạn đã tạo ra từ đó. Ngoài ra, câu hỏi của bạn là rất mơ hồ. Bạn cần cung cấp mô tả tốt hơn về vấn đề của mình, những gì bạn đang cố gắng làm. Nếu không, chúng tôi không thể giúp bạn. –

+0

@ John: Bạn đang rất khắc nghiệt. Tôi đã phải kiềm chế bản thân mình từ liên kết đến lmgtfy, vì vậy đây là một lời giải thích từ MySQL thay vào đó: http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html –

+0

@A. Rex - Tôi là ác (trong một ý nghĩa) quan điểm của tôi đi qua của tôi là khắc nghiệt nhưng câu hỏi là thiếu liên quan đến cách bạn sẽ cụm từ một câu hỏi hay. Như vậy chúng tôi (ngăn xếp người tràn) không thể cung cấp một câu trả lời tốt dựa trên thông tin không đầy đủ. –

Trả lời

8

Làm cách nào để sửa đổi MySQL để phù hợp với điều này?

Bạn sẽ phải thay đổi ý tưởng của MySQL về từ là gì.

Thứ nhất, độ dài từ tối thiểu mặc định là 4. Điều này có nghĩa là không có cụm từ tìm kiếm nào chỉ chứa các từ < 4 chữ cái sẽ khớp với nhau, cho dù đó là ‘C++’ hoặc ‘cpp’. Bạn có thể định cấu hình điều này bằng cách sử dụng tùy chọn cấu hình ft_min_word_len, ví dụ: trong my.cfg của bạn:

[mysqld] 
ft_min_word_len=3 

(Sau đó stop/start mysqld và xây dựng lại các chỉ số toàn văn.)

Thứ hai, ‘+’ không được coi là một bức thư của MySQL. Bạn có thể làm cho nó một lá thư, nhưng sau đó có nghĩa là bạn sẽ không thể tìm kiếm từ ‘cá’ trong chuỗi ‘cá + khoai tây chiên’, vì vậy cần phải chăm sóc một số. Và nó không tầm thường: nó đòi hỏi biên dịch lại MySQL hoặc hack một bộ ký tự hiện có. Xem phần bắt đầu “Nếu bạn muốn thay đổi tập hợp các ký tự được coi là ký tự từ ...” trong section 11.8.6 của tài liệu.

thoát khỏi nhân vật + trong quá trình nhập dữ liệu của tôi như là một cái gì đó như "__plus" và sau đó sửa đổi tìm kiếm của tôi để chứa

Vâng, giống như đó là một giải pháp chung: bạn có thể giữ bạn dữ liệu 'thực' (không có thoát) trong bảng chính, dứt khoát - thường sử dụng InnoDB để tuân thủ ACID. Sau đó, một bảng MyISAM bổ sung có thể được thêm vào, chỉ chứa các từ bị cắt xén cho mồi tìm kiếm toàn văn. Bạn cũng có thể làm một hình thức giới hạn của bắt nguồn bằng cách sử dụng phương pháp này.

Khả năng khác là phát hiện tìm kiếm mà MySQL không thể thực hiện, chẳng hạn như những từ chỉ có từ ngắn hoặc ký tự không bình thường và quay lại tìm kiếm LIKE hoặc REGEXP đơn giản nhưng chậm. Trong trường hợp này, có thể bạn cũng sẽ muốn xóa danh sách dừng bằng cách đặt ft_stopword_file thành một chuỗi trống, vì việc thực hiện mọi thứ trong đó cũng đặc biệt cũng không thực tế.

+0

@bobince: (Hãy thảo luận trong các ý kiến ​​ở trên, cảm ơn bạn đã trả lời câu hỏi dễ hiểu này một cách rõ ràng.) sự tò mò, bạn sẽ bắt đầu với cách tiếp cận này như thế nào? Thay thế mọi từ trong bảng phụ bằng thân cây của nó? –

+0

Về cơ bản có (xử lý các từ trong các truy vấn tìm kiếm theo cùng một cách tất nhiên). Thông thường, bạn sẽ sử dụng thư viện gốc ghép hậu tố hiện có cho các ngôn ngữ ưa thích của mình. (Đối với cả hai giá trị của ‘ngôn ngữ’; xem ví dụ: Thuật toán của Porter cho tiếng Anh bằng nhiều ngôn ngữ lập trình.) – bobince

0

Thông thường các ký tự thoát được sử dụng trong truy vấn không có trong dữ liệu của cơ sở dữ liệu. Hãy thử thoát từng "+" trong truy vấn của bạn.

1

Từ http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html:

Một cụm từ được kèm theo trong dấu nháy kép (“"”) nhân vật phù hợp với chỉ hàng có chứa cụm từ theo nghĩa đen, vì nó đã được gõ

Điều này có nghĩa bạn. có thể tìm kiếm cho 'C++' sử dụng truy vấn này:

SELECT * 
FROM mytable 
WHERE MATCH (field1, field2, field3) 
AGAINST ('"C++"' IN BOOLEAN MODE) 
0

giải pháp ::

thay đổi my.ini tập tin

đưa hai dòng sau

ft_min_word_len = "1" 
ft_stopword_file ="" 

dưới

[mysqld] 

hơn tập tin savve và máy chủ khởi động lại mysql.

my.ini tệp sẽ được chia sẻ cho tất cả. vì vậy chúng tôi có thể thực hiện thay đổi trong my.ini tệp cho một số phiên chỉ.?

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