So sánh công cụ tìm kiếm toàn văn bản - Lucene, Sphinx, Postgresql, MySQL?


312

Tôi đang xây dựng một trang web Django và tôi đang tìm kiếm một công cụ tìm kiếm.

Một vài ứng cử viên:

  • Lucene / Lucene với La bàn / Solr

  • Nhân sư

  • Postgresql tích hợp tìm kiếm toàn văn

  • MySQl tích hợp tìm kiếm toàn văn

Tiêu chí lựa chọn:

  • kết quả phù hợp và xếp hạng
  • tốc độ tìm kiếm và lập chỉ mục
  • dễ sử dụng và dễ tích hợp với Django
  • yêu cầu tài nguyên - trang web sẽ được lưu trữ trên VPS , vì vậy lý tưởng nhất là công cụ tìm kiếm sẽ không cần nhiều RAM và CPU
  • khả năng mở rộng
  • các tính năng bổ sung như "ý bạn là gì?", các tìm kiếm liên quan, v.v.

Bất cứ ai đã có kinh nghiệm với các công cụ tìm kiếm ở trên hoặc các công cụ khác không có trong danh sách - tôi rất thích nghe ý kiến ​​của bạn.

EDIT: Đối với nhu cầu lập chỉ mục, khi người dùng tiếp tục nhập dữ liệu vào trang web, những dữ liệu đó sẽ cần được lập chỉ mục liên tục. Nó không phải là thời gian thực, nhưng lý tưởng là dữ liệu mới sẽ hiển thị trong chỉ mục với độ trễ không quá 15 - 30 phút


26
2: Tìm kiếm và giao dịch toàn văn bản của MySQL (hiện tại) loại trừ lẫn nhau. Các chỉ mục fulltext của MySQL yêu cầu loại bảng MyISAM, không hỗ trợ các giao dịch. (Trái ngược với loại bảng InnoDB hỗ trợ các giao dịch, nhưng không phải là chỉ mục toàn văn bản.)
Carl G

2
PostgreSQL tìm kiếm toàn văn, Tsearch không hỗ trợ tìm kiếm cụm từ. Tuy nhiên, nó nằm trong danh sách TODO sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam

1
Bất cứ ai nhìn vào điều này cho Django nên kiểm tra ứng dụng haystack. haystacksearch.org
Keyo


24
@CarlG, Chỉ để mọi người tham khảo. MySQL 5.6+ có hỗ trợ tìm kiếm toàn văn bản với công cụ innodb
DhruvPathak

Câu trả lời:


167

Thật tốt khi thấy ai đó theo đuổi về Lucene - bởi vì tôi không biết gì về điều đó.

Sphinx, mặt khác, tôi biết khá rõ, vì vậy hãy xem liệu tôi có thể giúp được gì không.

  • Xếp hạng kết quả phù hợp là mặc định. Bạn có thể thiết lập sắp xếp của riêng bạn nếu bạn muốn và cung cấp cho các trường cụ thể trọng số cao hơn.
  • Tốc độ lập chỉ mục là siêu nhanh, bởi vì nó nói chuyện trực tiếp với cơ sở dữ liệu. Bất kỳ sự chậm chạp nào cũng sẽ đến từ các truy vấn SQL phức tạp và các khóa ngoại không được lập chỉ mục và các vấn đề khác như vậy. Tôi chưa bao giờ nhận thấy bất kỳ sự chậm chạp trong việc tìm kiếm.
  • Tôi là một người Rails, vì vậy tôi không biết việc thực hiện với Django dễ dàng như thế nào. Có một API Python đi kèm với nguồn Sphinx.
  • Trình nền dịch vụ tìm kiếm (searchd) khá thấp về mức sử dụng bộ nhớ - và bạn có thể đặt giới hạn cho số lượng bộ nhớ mà quá trình lập chỉ mục sử dụng.
  • Khả năng mở rộng là nơi kiến ​​thức của tôi sơ sài hơn - nhưng đủ dễ dàng để sao chép các tệp chỉ mục vào nhiều máy và chạy một số trình nền tìm kiếm. Ấn tượng chung mà tôi nhận được từ những người khác là nó khá tốt khi chịu tải cao, do đó, việc nhân rộng nó ra trên nhiều máy không phải là điều cần phải xử lý.
  • Không có hỗ trợ cho 'did-you-mean', v.v. - mặc dù những điều này có thể được thực hiện với các công cụ khác đủ dễ dàng. Nhân sư thực hiện các từ gốc mặc dù sử dụng từ điển, vì vậy 'lái xe' và 'lái xe' (ví dụ) sẽ được coi là giống nhau trong các tìm kiếm.
  • Sphinx không cho phép cập nhật chỉ mục một phần cho dữ liệu thực địa. Cách tiếp cận phổ biến cho vấn đề này là duy trì chỉ số delta với tất cả các thay đổi gần đây và lập chỉ mục lại sau mỗi thay đổi (và những kết quả mới này xuất hiện trong vòng một hoặc hai giây). Do số lượng dữ liệu nhỏ, việc này có thể mất vài giây. Bạn vẫn sẽ cần lập chỉ mục lại bộ dữ liệu chính thường xuyên (mặc dù mức độ thường xuyên phụ thuộc vào mức độ biến động của dữ liệu của bạn - mỗi ngày? Mỗi giờ?). Tốc độ lập chỉ mục nhanh giữ cho tất cả điều này khá đau đớn mặc dù.

Tôi không biết làm thế nào để áp dụng cho tình huống của bạn, nhưng Evan Weaver đã so sánh một số tùy chọn tìm kiếm Rails phổ biến (Sphinx, Ferret (một cổng của Lucene cho Ruby) và Solr), chạy một số điểm chuẩn. Có thể hữu ích, tôi đoán.

Tôi đã không tìm hiểu sâu về tìm kiếm toàn văn bản của MySQL, nhưng tôi biết nó không cạnh tranh về tốc độ cũng như tính năng thông minh với Sphinx, Lucene hoặc Solr.


Sphinx không cho phép bạn cập nhật các thuộc tính riêng lẻ của các mục trong các chỉ mục hiện tại, nhưng không xóa / cập nhật các bản ghi đầy đủ.
Xorlev

sphinx RT cho phép bạn thực hiện cập nhật / xóa một phần. nó đang ở giai đoạn đầu nhưng đã [gần như] hoạt động. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd

4
Đây là một câu trả lời trên Solr là một cặp tốt cho câu trả lời này trên Sphinx
New Alexandria

Không có gì có thể sánh với Sphinx về tốc độ, vì vậy nếu tốc độ là mối quan tâm số một của bạn thì Sphinx là lựa chọn phù hợp. Bài đăng hay
twigg

Sphinx 2.3.2 Beta hiện có một tính năng gọi là 'CALL SUGGEST' có thể được sử dụng để thực hiện 'ý bạn là gì?' sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K

82

Tôi không biết Sphinx, nhưng đối với Lucene so với tìm kiếm toàn văn cơ sở dữ liệu, tôi nghĩ rằng hiệu suất của Lucene là không thể so sánh được. Bạn sẽ có thể thực hiện hầu hết mọi tìm kiếm trong vòng chưa đến 10 ms, bất kể bạn có bao nhiêu hồ sơ để tìm kiếm, miễn là bạn đã thiết lập chính xác chỉ số Lucene của mình.

Ở đây có một trở ngại lớn nhất: cá nhân tôi nghĩ rằng việc tích hợp Lucene vào dự án của bạn là không dễ dàng . Chắc chắn, không quá khó để thiết lập nó để bạn có thể thực hiện một số tìm kiếm cơ bản, nhưng nếu bạn muốn tận dụng tối đa nó, với hiệu suất tối ưu, thì bạn chắc chắn cần một cuốn sách hay về Lucene.

Đối với các yêu cầu về CPU & RAM, việc thực hiện tìm kiếm trong Lucene không làm nhiệm vụ CPU của bạn quá nhiều, mặc dù việc lập chỉ mục dữ liệu của bạn là mặc dù bạn không làm điều đó quá thường xuyên (có thể một hoặc hai lần một ngày), vì vậy điều đó không phải nhiều trở ngại

Nó không trả lời tất cả các câu hỏi của bạn, nhưng tóm lại, nếu bạn có nhiều dữ liệu để tìm kiếm và bạn muốn có hiệu suất tuyệt vời, thì tôi nghĩ rằng Lucene chắc chắn là con đường để đi. Nếu bạn không có nhiều dữ liệu để tìm kiếm, thì bạn cũng có thể tìm kiếm cơ sở dữ liệu tìm kiếm toàn văn bản. Thiết lập tìm kiếm toàn văn bản MySQL chắc chắn dễ dàng hơn trong cuốn sách của tôi.


10
So với nhân sư, lucence là tooo chậm và cồng kềnh. Tôi đã sử dụng cả trong dự án của mình và cuối cùng tôi đã gắn bó với nhân sư. Lucence có trong java và cần nhiều CPU và RAM hơn Sphinx.
Phyo Arkar Lwin

25
Tôi phải phản đối ở điểm này. Lucene nhanh như chớp NẾU bạn xây dựng một chỉ số chính xác. Về cơ bản, bạn có thể thực hiện một truy vấn nâng cao qua hàng triệu bản ghi chỉ trong vài mili giây. Bạn chỉ cần biết những gì bạn đang làm. Và Lucene là trong java ... quan điểm của bạn là gì? Ngoài ra còn có cổng .NET, Lucene.NET btw.
Razzie

15
nhưng bạn đã tuyên bố rõ ràng rằng bạn không sử dụng nhân sư và v3sson đã sử dụng cả hai.
dùng508546

20
Làm thế nào bạn có thể nói rằng hiệu suất của lucene là không thể so sánh trong cùng một câu mà bạn nói rằng bạn chưa sử dụng nhân sư?
dùng508546

22
Câu hỏi hợp lệ. Tôi chưa bao giờ nói rằng Lucene nhanh hơn Sphinx, tôi đã đề cập rằng Lucene vs một cơ sở dữ liệu tìm kiếm toàn văn bản là không thể so sánh được. Và nó là. Không có câu hỏi về điều đó. Lucene dựa trên một chỉ số đảo ngược. Bây giờ tôi không biết Sphinx, như đã đề cập trước đây, nhưng nếu nó cũng sử dụng một chỉ mục đảo ngược hoặc một phương pháp lập chỉ mục tương tự thì có thể chúng có hiệu suất như nhau. Nói rằng Lucene, so với Nhân sư, sẽ là 'tooo chậm và cồng kềnh' không dựa trên sự thật. Đặc biệt là không chỉ khi người ta nói rằng Lucene ở trong 'Java', đây chỉ là một vấn đề vô lý về mặt hiệu suất.
Razzie

60

Tôi ngạc nhiên rằng không có nhiều thông tin được đăng về Solr. Solr khá giống với Sphinx nhưng có nhiều tính năng nâng cao hơn (AFAIK vì tôi chưa sử dụng Sphinx - chỉ đọc về nó).

Câu trả lời tại liên kết dưới đây chi tiết một vài điều về Nhân sư cũng áp dụng cho Solr. So sánh công cụ tìm kiếm toàn văn bản - Lucene, Sphinx, Postgresql, MySQL?

Solr cũng cung cấp các tính năng bổ sung sau:

  1. Hỗ trợ nhân rộng
  2. Nhiều lõi (nghĩ về những điều này như các cơ sở dữ liệu riêng biệt với cấu hình và chỉ mục riêng của chúng)
  3. Tìm kiếm Boolean
  4. Làm nổi bật các từ khóa (khá dễ thực hiện trong mã ứng dụng nếu bạn có regex-fu; tuy nhiên, tại sao không để một công cụ chuyên dụng làm việc tốt hơn cho bạn)
  5. Cập nhật chỉ mục qua XML hoặc tệp được phân tách
  6. Giao tiếp với máy chủ tìm kiếm thông qua HTTP (thậm chí nó có thể trả về Json, PHP / Ruby / Python gốc)
  7. Lập chỉ mục tài liệu PDF, Word
  8. Trường động
  9. Khía cạnh
  10. Trường tổng hợp
  11. Dừng từ, từ đồng nghĩa, vv
  12. Hơn như thế này...
  13. Lập chỉ mục trực tiếp từ cơ sở dữ liệu với các truy vấn tùy chỉnh
  14. Tự động đề xuất
  15. Tự động lưu trữ bộ đệm
  16. Lập chỉ mục nhanh (so với thời gian lập chỉ mục tìm kiếm toàn văn bản của MySQL) - Lucene sử dụng định dạng chỉ mục đảo ngược nhị phân.
  17. Tăng cường (quy tắc tùy chỉnh để tăng mức độ liên quan của một từ khóa hoặc cụm từ cụ thể, v.v.)
  18. Tìm kiếm theo trường (nếu người dùng tìm kiếm biết trường mà anh ấy / cô ấy muốn tìm, họ thu hẹp tìm kiếm bằng cách nhập trường, sau đó giá trị và CHỈ trường đó được tìm kiếm thay vì mọi thứ - trải nghiệm người dùng tốt hơn nhiều)

BTW, có nhiều tính năng hơn; tuy nhiên, tôi chỉ liệt kê các tính năng mà tôi đã thực sự sử dụng trong sản xuất. BTW, ngoài hộp, MySQL hỗ trợ # 1, # 3 và # 11 (giới hạn) trong danh sách trên. Đối với các tính năng bạn đang tìm kiếm, cơ sở dữ liệu quan hệ sẽ không cắt giảm. Tôi sẽ loại bỏ chúng ngay lập tức.

Ngoài ra, một lợi ích khác là Solr (thật ra, Lucene thực sự) là một cơ sở dữ liệu tài liệu (ví dụ NoQuery) nên nhiều lợi ích của bất kỳ cơ sở dữ liệu tài liệu nào khác có thể được nhận ra với Solr. Nói cách khác, bạn có thể sử dụng nó cho nhiều mục đích hơn là chỉ tìm kiếm (tức là Hiệu suất). Hãy sáng tạo với nó :)


Sphinx cũng về Hỗ trợ sao chép Nhiều lõi Tìm kiếm Boolean Làm nổi bật các từ khóa Cập nhật chỉ mục qua XML - hoặc tệp được phân tách bằng tệp PDF, lập chỉ mục tài liệu Word (qua xml) Các mặt Dừng từ, từ đồng nghĩa, v.v. Lập chỉ mục trực tiếp từ cơ sở dữ liệu với các truy vấn tùy chỉnh Tự động đề xuất nhanh lập chỉ mục Tăng cường tìm kiếm theo trường Giới thiệu về các trường động Các trường tổng hợp Bộ đệm Tự động Tôi chỉ không biết
Moosh

58

Solr Apache


Ngoài việc trả lời các truy vấn của OP, hãy để tôi đưa ra một số hiểu biết về Apache Solr từ giới thiệu đơn giản đến cài đặttriển khai chi tiết .

Giới thiệu đơn giản


Bất cứ ai đã có kinh nghiệm với các công cụ tìm kiếm ở trên hoặc các công cụ khác không có trong danh sách - tôi rất thích nghe ý kiến ​​của bạn.

Solr không nên được sử dụng để giải quyết các vấn đề thời gian thực. Đối với các công cụ tìm kiếm, Solr là trò chơi khá nhiều và hoạt động hoàn hảo .

Solr hoạt động tốt trên các ứng dụng web có lưu lượng truy cập cao ( Tôi đã đọc ở đâu đó rằng nó không phù hợp với điều này, nhưng tôi đang sao lưu tuyên bố đó ). Nó sử dụng RAM, không phải CPU.

  • kết quả phù hợp và xếp hạng

Việc tăng giúp bạn xếp hạng kết quả của bạn hiển thị trên đầu trang. Này, bạn đang cố gắng để tìm kiếm một tên john trong các lĩnh vực firstnamelastname , và bạn muốn đưa ra liên quan đến firstname lĩnh vực, sau đó bạn cần phải tăng lên firstname lĩnh vực như thể hiện.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Như bạn có thể thấy, firstname lĩnh vực đang tăng lên với tỷ số 2.

Thông tin thêm về SolrRelevancy

  • tốc độ tìm kiếm và lập chỉ mục

Tốc độ nhanh đến mức không thể tin được và không có sự thỏa hiệp nào về điều đó. Lý do tôi chuyển đến Solr .

Về tốc độ lập chỉ mục, Solr cũng có thể xử lý THAM GIA từ các bảng cơ sở dữ liệu của bạn. THAM GIA cao hơn và phức tạp hơn ảnh hưởng đến tốc độ lập chỉ mục. Tuy nhiên, một cấu hình RAM khổng lồ có thể dễ dàng giải quyết tình huống này.

RAM càng cao, tốc độ lập chỉ mục của Solr càng nhanh.

  • dễ sử dụng và dễ tích hợp với Django

Không bao giờ cố gắng tích hợp SolrDjango , tuy nhiên bạn có thể đạt được điều đó với Haystack . Tôi đã tìm thấy một số bài viết thú vị trên cùng và đây là github cho nó.

  • yêu cầu tài nguyên - trang web sẽ được lưu trữ trên VPS, vì vậy lý tưởng nhất là công cụ tìm kiếm sẽ không cần nhiều RAM và CPU

Solr sinh ra trên RAM, vì vậy nếu RAM cao, bạn không phải lo lắng về Solr .

Việc sử dụng RAM của Solr sẽ giúp lập chỉ mục đầy đủ nếu bạn có vài tỷ bản ghi, bạn có thể sử dụng thông minh nhập khẩu Delta để giải quyết tình huống này một cách thông minh. Như đã giải thích, Solr chỉ là một giải pháp gần thời gian thực .

  • khả năng mở rộng

Solr có khả năng mở rộng cao. Hãy xem trên SolrCloud . Một số tính năng chính của nó.

  • Phân đoạn (hoặc shending là khái niệm phân phối chỉ mục giữa nhiều máy, giả sử nếu chỉ mục của bạn tăng quá lớn)
  • Cân bằng tải (nếu Solrj được sử dụng với đám mây Solr, nó sẽ tự động xử lý cân bằng tải bằng cơ chế Round-Robin của nó)
  • Tìm kiếm phân tán
  • Tính sẵn sàng cao
  • các tính năng bổ sung như "ý bạn là gì?", các tìm kiếm liên quan, v.v.

Đối với kịch bản trên, bạn có thể sử dụng SpellCheckComponent được đóng gói với Solr . Có rất nhiều tính năng khác, SnowballPorterFilterFactory giúp truy xuất các bản ghi cho biết nếu bạn nhập, sách thay vì sách , bạn sẽ được trình bày các kết quả liên quan đến sách .


Câu trả lời này tập trung rộng rãi vào Apache Solr & MySQL . Django nằm ngoài phạm vi.

Giả sử rằng bạn đang ở trong môi trường LINUX, bạn có thể tiếp tục bài viết này. (của tôi là phiên bản Ubuntu 14.04)

Cài đặt chi tiết

Bắt đầu

Tải xuống Apache Solr từ đây . Đó sẽ là phiên bản 4.8.1 . Bạn có thể tải về các phiên bản mới, tôi thấy điều này ổn định.

Sau khi tải xuống kho lưu trữ, giải nén nó vào một thư mục bạn chọn. Nói .. Downloadshoặc bất cứ điều gì .. Vì vậy, nó sẽ trông giống nhưDownloads/solr-4.8.1/

Theo lời nhắc của bạn .. Điều hướng trong thư mục

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Vì vậy, bây giờ bạn đang ở đây ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Khởi động máy chủ ứng dụng Jetty

Cầu tàu có sẵn trong thư mục ví dụ của thư mục solr-4.8.1, vì vậy hãy điều hướng bên trong đó và khởi động Máy chủ ứng dụng Jetty.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Bây giờ, không đóng thiết bị đầu cuối, giảm thiểu nó và để nó sang một bên.

(MIPO: Sử dụng & sau start.jar để làm cho Máy chủ Jetty chạy trong nền)

Để kiểm tra xem Apache Solr có chạy thành công hay không, hãy truy cập URL này trên trình duyệt. http: // localhost: 8983 / solr

Chạy cầu cảng trên cổng tùy chỉnh

Nó chạy trên cổng 8983 như mặc định. Bạn có thể thay đổi cổng ở đây hoặc trực tiếp bên trong jetty.xmltệp.

java -Djetty.port=9091 -jar start.jar

Tải xuống JConnector

Tệp JAR này hoạt động như một cầu nối giữa MySQL và JDBC, Tải xuống Phiên bản độc lập nền tảng tại đây

Sau khi tải xuống, giải nén thư mục và sao chép mysql-connector-java-5.1.31-bin.jarvà dán vào thư mục lib .

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Tạo bảng MySQL được liên kết với Apache Solr

Để đưa Solr vào sử dụng, Bạn cần có một số bảng và dữ liệu để tìm kiếm. Vì vậy, chúng tôi sẽ sử dụng MySQL để tạo bảng và đẩy một số tên ngẫu nhiên và sau đó chúng tôi có thể sử dụng Solr để kết nối với MySQL và lập chỉ mục cho bảng đó và các mục đó.

Cấu trúc 1.Table

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. Lập bảng trên

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

Vào bên trong lõi và thêm các chỉ thị lib

1. Định hướng đến

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.Modifying solrconfig.xml

Thêm hai chỉ thị này vào tập tin này ..

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Bây giờ thêm DIH (Trình xử lý nhập dữ liệu)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3. Tạo tệp db-data-config.xml

Nếu tệp tồn tại thì bỏ qua, thêm các dòng này vào tệp đó. Như bạn có thể thấy dòng đầu tiên, bạn cần cung cấp thông tin đăng nhập của sở dữ liệu MySQL của bạn . Tên cơ sở dữ liệu, tên người dùng và mật khẩu.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(MIPO: Bạn có thể có bất kỳ số lượng thực thể nào nhưng coi chừng trường id, nếu chúng giống nhau thì việc lập chỉ mục sẽ bị bỏ qua.)

4. Sửa đổi tệp giản đồ

Thêm này để bạn schema.xml như ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Thực hiện

Lập chỉ mục

Đây là nơi thỏa thuận thực sự. Bạn cần lập chỉ mục dữ liệu từ MySQL đến Solr inorder để sử dụng Truy vấn Solr.

Bước 1: Chuyển đến Bảng quản trị Solr

Nhấn URL http: // localhost: 8983 / solr trên trình duyệt của bạn. Màn hình mở ra như thế này.

Đây là Bảng quản trị Solr chính của Apache

Như điểm đánh dấu chỉ ra, hãy vào Nhật ký đăng ký để kiểm tra xem có bất kỳ cấu hình nào ở trên đã dẫn đến lỗi không.

Bước 2: Kiểm tra Nhật ký của bạn

Ok, bây giờ bạn đang ở đây, vì bạn có thể có rất nhiều tin nhắn màu vàng (CẢNH BÁO). Hãy chắc chắn rằng bạn không có thông báo lỗi được đánh dấu màu đỏ. Trước đó, về cấu hình của chúng tôi, chúng tôi đã thêm một truy vấn chọn trên db-data-config.xml của chúng tôi , nói rằng nếu có bất kỳ lỗi nào trên truy vấn đó, thì nó sẽ hiển thị ở đây.

Đây là phần ghi nhật ký của công cụ Apache Solr của bạn

Tốt, không có lỗi. Chúng tôi tốt để đi. Hãy chọn bộ sưu tập1 từ danh sách như mô tả và chọn Dataimport

Bước 3: DIH (Trình xử lý nhập dữ liệu)

Sử dụng DIH, bạn sẽ kết nối với MySQL từ Solr thông qua tệp cấu hình db-data-config.xml từ giao diện Solr và truy xuất 10 bản ghi từ cơ sở dữ liệu được lập chỉ mục trên Solr .

Để làm điều đó, Chọn nhập đầy đủ và kiểm tra các tùy chọn Làm sạchCam kết . Bây giờ bấm vào Thực thi như được hiển thị.

Ngoài ra, bạn cũng có thể sử dụng truy vấn nhập đầy đủ trực tiếp như thế này ..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

Trình xử lý nhập dữ liệu

Sau khi bạn nhấp vào Thực thi , Solr bắt đầu lập chỉ mục các bản ghi, nếu có bất kỳ lỗi nào, nó sẽ báo Chỉ mục không thành công và bạn phải quay lại phần Ghi nhật ký để xem có gì sai.

Giả sử không có lỗi với cấu hình này và nếu việc lập chỉ mục hoàn tất thành công., Bạn sẽ nhận được thông báo này.

Lập chỉ mục thành công

Bước 4: Chạy truy vấn Solr

Có vẻ như mọi thứ đều ổn, bây giờ bạn có thể sử dụng Truy vấn Solr để truy vấn dữ liệu được lập chỉ mục. Nhấp vào Truy vấn ở bên trái và sau đó nhấn nút Thực thi ở phía dưới.

Bạn sẽ thấy các bản ghi được lập chỉ mục như được hiển thị.

Truy vấn Solr tương ứng để liệt kê tất cả các bản ghi là

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

Dữ liệu được lập chỉ mục

Vâng, có tất cả 10 hồ sơ được lập chỉ mục. Giả sử, chúng tôi chỉ cần tên bắt đầu bằng Ja , trong trường hợp này, bạn cần nhắm mục tiêu tên cột solr_name, do đó truy vấn của bạn sẽ như thế này.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Dữ liệu JSON bắt đầu bằng Ja *

Đó là cách bạn viết Solr Queries. Để đọc thêm về nó, kiểm tra bài viết đẹp này .


3
@Downvoter, vui lòng bình luận hoặc chỉnh sửa câu trả lời này và lý do cho downvote cũng sẽ giúp người khác.
Shankar Damodaran

4
đây là một trong những bài viết toàn diện và được tổ chức tốt nhất tôi từng thấy trên SO. Công việc tuyệt vời
thoái hóa

28

Tôi đang xem xét tìm kiếm toàn văn bản PostgreSQL ngay bây giờ và nó có tất cả các tính năng phù hợp của một công cụ tìm kiếm hiện đại, nhân vật mở rộng thực sự tốt và hỗ trợ đa ngôn ngữ, tích hợp chặt chẽ với các trường văn bản trong cơ sở dữ liệu.

Nhưng nó không có các toán tử tìm kiếm thân thiện với người dùng như + hoặc AND (sử dụng & |!) Và tôi không thích thú với cách nó hoạt động trên trang web tài liệu của họ. Mặc dù có nhiều điều khoản trùng khớp trong đoạn kết quả, thuật toán mặc định cho thuật ngữ đối sánh không tuyệt vời. Ngoài ra, nếu bạn muốn lập chỉ mục rtf, PDF, MS Office, bạn phải tìm và tích hợp trình chuyển đổi định dạng tệp.

OTOH, nó tốt hơn so với tìm kiếm văn bản MySQL, thậm chí không lập chỉ mục các từ có ba chữ cái trở xuống. Đây là mặc định cho tìm kiếm MediaWiki và tôi thực sự nghĩ rằng nó không tốt cho người dùng cuối: http://www.searchtools.com/analysis/mediawiki-search/

Trong tất cả các trường hợp tôi đã thấy, Lucene / Solr và Sphinx thực sự tuyệt vời . Chúng là mã vững chắc và đã phát triển với những cải tiến đáng kể về khả năng sử dụng, vì vậy tất cả các công cụ đều có để tìm kiếm thỏa mãn hầu hết mọi người.

cho SHAILI - SOLR bao gồm thư viện mã tìm kiếm Lucene và có các thành phần để trở thành một công cụ tìm kiếm độc lập tốt đẹp.


1
Tôi tin rằng bằng cách tìm kiếm toàn văn bản PostgreSQL mà bạn đang đề cập đến Tsearch. Nhưng Tsearch không hỗ trợ tìm kiếm cụm từ. Nó vẫn nằm trong danh sách TODO của họ sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam

1
Chỉ cần thực hiện một loạt các thử nghiệm trên tìm kiếm toàn văn bản Postgres 9.0; đã thất vọng khi thấy rằng văn bản tiếng Pháp không phù hợp nếu người dùng quên để có được tất cả các dấu đúng. Kết hợp các hình thức từ là chắp vá - ví dụ, trong tiếng Anh "nói" không khớp với văn bản có chứa "đã nói". Nhìn chung khá ấn tượng mặc dù đối với một tính năng tích hợp trên các ngôn ngữ được thử nghiệm (en, fr, ru).
Roman Starkov

9
@romkyns: bạn cần cài đặt một từ điển không có nguồn gốc để loại bỏ chúng.
Denis de Bernardy

2
"OTOH, nó tốt hơn so với tìm kiếm văn bản MySQL, thậm chí không lập chỉ mục các từ có ba chữ cái trở xuống." Đó không phải là một hạn chế tích hợp của MySQL - đó là bất cứ điều gì bạn đặt trong tệp cấu hình. Nếu bạn muốn lập chỉ mục các từ một chữ cái, chỉ cần thay đổi một giá trị trong cấu hình.
Canuck

1
Điều đáng lo ngại là mọi người đang đưa ra so sánh về cơ sở dữ liệu mà họ chưa khám phá đầy đủ. MySQL CÓ thể lập chỉ mục các từ có ba ký tự trở xuống - bạn chỉ cần cấu hình đúng.
TheCarver

22

Chỉ hai xu của tôi cho câu hỏi rất cũ này. Tôi thực sự khuyên bạn nên xem qua Tìm kiếm đàn hồi .

Elaticsearch là một máy chủ tìm kiếm dựa trên Lucene. Nó cung cấp một công cụ tìm kiếm toàn văn bản có khả năng phân tán, đa năng với giao diện web RESTful và các tài liệu JSON không có lược đồ. Elaticsearch được phát triển bằng Java và được phát hành dưới dạng nguồn mở theo các điều khoản của Giấy phép Apache.

Những lợi thế so với các công cụ FTS khác (tìm kiếm toàn văn) là:

  • Giao diện RESTful
  • Khả năng mở rộng tốt hơn
  • Cộng đồng lớn
  • Được xây dựng bởi các nhà phát triển Lucene
  • Tài liệu mở rộng
  • Có rất nhiều thư viện mã nguồn mở có sẵn (bao gồm Django)

Chúng tôi đang sử dụng công cụ tìm kiếm này tại dự án của chúng tôi và rất hài lòng với nó.


10

SearchTools-Avi cho biết "Tìm kiếm văn bản MySQL, thậm chí không lập chỉ mục các từ có ba chữ cái trở xuống."

FYIs, Độ dài từ tối thiểu của MySQL fulltext được điều chỉnh vì ít nhất là MySQL 5.0. Google 'mysql fulltext min length' cho các hướng dẫn đơn giản.

Điều đó nói rằng, MySQL fulltext có những hạn chế: đối với một, nó sẽ bị cập nhật chậm khi bạn đạt được một triệu bản ghi hoặc hơn, ...


2

Tôi sẽ thêm mnoGoSearch vào danh sách. Giải pháp cực kỳ hiệu quả và linh hoạt, hoạt động như Google: bộ chỉ mục tìm nạp dữ liệu từ nhiều trang web, Bạn có thể sử dụng các tiêu chí cơ bản hoặc phát minh ra các móc của riêng bạn để có chất lượng tìm kiếm tối đa. Ngoài ra, nó có thể lấy dữ liệu trực tiếp từ cơ sở dữ liệu.

Các giải pháp không được biết đến ngày hôm nay, nhưng nó đáp ứng nhu cầu tối đa. Bạn có thể biên dịch và cài đặt nó hoặc trên máy chủ độc lập hoặc thậm chí trên máy chủ chính của bạn, nó không cần nhiều nguồn tài nguyên như Solr, vì nó được viết bằng C và chạy hoàn hảo ngay cả trên các máy chủ nhỏ.

Ban đầu, bạn cần tự biên dịch nó, vì vậy nó đòi hỏi một số kiến ​​thức. Tôi đã tạo một tập lệnh nhỏ cho Debian, có thể giúp ích. Bất kỳ điều chỉnh đều được chào đón.

Khi bạn đang sử dụng khung Django, Bạn có thể sử dụng hoặc máy khách PHP ở giữa hoặc tìm một giải pháp trong Python, tôi đã thấy một số bài viết .

Và, tất nhiên mnoGoSearch là mã nguồn mở, GNU GPL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.