MySQL: kelime arama ile sorgu zaman geliştirin

4 Cevap php

Scenario

I have a search facility on a website that sells products.
The page is built with PHP and MySQL searching against a Merged View that joins 10+ tables together. There are approx 12,000 records in the view with 20+ fields each.

A user can search for products matching a specific criteria using multiple (10-15) select menus.
The database then returns results based on the select menu values against the products primary keys.

Bu tüm ince ve olduğu gibi yeterince hızlı hızda çalışır.

Problem

Kullanıcıların elle onlar yerine menüleri kullanarak daha arıyor ne yazabilirsiniz böylece Ancak, aynı sayfada, ben de bir metin kutusu dahil ettik.

As the users are typing actual words rather than selecting PK's via a menu, the database has to do a word search. For lack of knowledge on a better method, I have concantenated all of the text values from the foreign criteria tables into one big field.
The textbox then searches against words within this concantenated field.

Again, this works fine, but changes a typical search time from 0.1 seconds to 2.0 seconds.
I have indexed all of the fields from the tables used by the Merged View in an effort to improve times, this however, didn't help at all.

Question

Google kelime "Taşma" için 1 saniyede 22.200.000 sayfaları bulabilirsiniz ve benim veritabanı yalnızca 12.000 kayıtları karşı bir sözcük aramak için 2 saniye sürer beri.

Nasıl düzeni ve veritabanı arama yöntemi geliştirmek?

4 Cevap

Ben çok bu durumda Lucene Solr öneriyoruz. Çok bu görev için çok uygun bir ters indeks sistemi vardır. (Eğer önyüz aracılığı ile arayüz) PHP ile kullanabilirsiniz.

(En azından öğreticiler bazı bakmak) ona bir çatlak alın ve yukarı ve çalışan ne kadar hızlı şaşıracaksınız.

Eğer bir veya daha fazla sütun üzerinde FULLTEXT dizin oluşturmak eğer MySQL full-text search yapabilirsiniz. Dan O'Reilly Databases:

MySQL FULLTEXT endeksleri veritabanı yöneticileri ve programcıları olarak (CHAR, VARCHAR, ya da TEXT) herhangi bir karakter tabanlı alanını belirlemek için izin bu alanlarda saklanan verilere karşı karmaşık metin arama için izin verir FULLTEXT endeksi.

Bu özellik MySQL LIKE fonksiyonu ile karıştırılmamalıdır değildir. LIKE bir düzenli ifadenin çizgisinde daha fazla çalışır. Öte yandan, FULLTEXT endeksleri tam stopwords destek alanları, boolean arama ve alaka derecelendirme endekslidir.

I have concantenated all of the text values from the foreign criteria tables into one big field. The textbox then searches against words within this concantenated field.

Bu bana hiç mantıklı. Sadece uygun alanlarda LIKE WHERE kullanarak denediniz mi? Ben bir şey eksik?

Eğer DB bir kelime arama ihtiyacı her zaman vurmak zorunda değilsiniz, böylece bellekte kelimeleri tutmak düşünmelisiniz. Bir veri yapısı içine kelimeleri montaj çalışacak ve sadece sizin db dağıtmak zamanında veri yapısını oluşturabilir.