Tam metin arama motorunun karşılaştırılması - Lucene, Sfenks, Postgresql, MySQL?


312

Bir Django sitesi inşa ediyorum ve bir arama motoru arıyorum.

Birkaç aday:

  • Lucene / Lucene ile Pusula / Solr

  • Sfenks

  • Postgresql yerleşik tam metin araması

  • MySQl yerleşik tam metin araması

Seçim kriterleri:

  • sonuç alaka düzeyi ve sıralama
  • arama ve indeksleme hızı
  • Django ile kullanım kolaylığı ve entegrasyon kolaylığı
  • kaynak gereksinimleri - site bir VPS'de barındırılacaktır , bu nedenle ideal olarak arama motoru çok fazla RAM ve CPU gerektirmez
  • ölçeklenebilirlik
  • "Bunu mu demek istediniz?", ilgili aramalar vb. gibi ekstra özellikler

Yukarıdaki arama motorları veya listede olmayan diğer motorlar ile deneyimi olan herkes - görüşlerinizi duymak isterim.

EDIT: Dizin oluşturma ihtiyaçları için, kullanıcılar siteye veri girmeye devam ettikçe, bu verilerin sürekli olarak dizine eklenmesi gerekir. Gerçek zamanlı olmak zorunda değildir, ancak ideal olarak yeni veriler 15-30 dakikadan fazla gecikmeyle dizinde görünecektir


26
2 ¢: MySQL tam metin araması ve işlemleri (şu anda) karşılıklı olarak münhasırdır. MySQL tam metin dizinleri, işlemleri desteklemeyen MyISAM tablo türünü gerektirir. (İşlemleri destekleyen ancak tam metin dizinlerini desteklemeyen InnoDB tablo türünün aksine.)
Carl G

2
PostgreSQL tam metin arama, Tsearch gelmez ifade arama desteği. Ancak, TODO listesinde sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam

1
Django için buna bakan herkes samanlık uygulamasını kontrol etmelidir. haystacksearch.org
Keyo


24
@CarlG, Sadece herkesin referansı için. MySQL 5.6+, innodb motoruyla tam metin arama desteğine sahiptir
DhruvPathak

Yanıtlar:


167

Birinin Lucene hakkında konuştuğunu görmek güzel - çünkü bunun hakkında hiçbir fikrim yok.

Sfenks, diğer taraftan, oldukça iyi biliyorum, bu yüzden yardım edip edemeyeceğimize bakalım.

  • Sonuç alaka düzeyi sıralaması varsayılan ayardır. İsterseniz kendi sıralamanızı oluşturabilir ve belirli alanlara daha fazla ağırlık verebilirsiniz.
  • Dizin oluşturma hızı süper hızlıdır, çünkü doğrudan veritabanıyla konuşur. Herhangi bir yavaşlık karmaşık SQL sorgularından ve dizine alınmamış yabancı anahtarlardan ve benzeri sorunlardan kaynaklanacaktır. Ben de aramada herhangi bir yavaşlama fark etmedim.
  • Ben bir Rails adamıyım, bu yüzden Django ile uygulamanın ne kadar kolay olduğunu bilmiyorum. Sfenks kaynağı ile birlikte gelen bir Python API var.
  • Arama hizmeti arka plan programı (searchd) bellek kullanımında oldukça düşüktür ve dizin oluşturucu işleminin ne kadar bellek kullandığına ilişkin sınırlar belirleyebilirsiniz .
  • Ölçeklenebilirlik, bilgimin daha kabataslak olduğu yerdir - ancak dizin dosyalarını birden çok makineye kopyalamak ve birkaç arama cinini çalıştırmak için yeterince kolaydır. Diğerlerinden aldığım genel izlenim, yüksek yük altında oldukça iyi olduğu, bu nedenle birden fazla makinede ölçeklendirilmesi, ele alınması gereken bir şey değil.
  • 'Kastettiğiniz' vb. İçin destek yoktur - bunlar diğer araçlarla kolayca yapılabilir. Sfenks sözlükleri kullanırken sözcükleri köklendirir, bu nedenle 'sürüş' ve 'sürüş' (örneğin) aramalarda aynı kabul edilir.
  • Sfenks, alan verileri için kısmi dizin güncellemelerine izin vermez. Bunun ortak yaklaşımı, son değişikliklerin tümü ile bir delta endeksi tutmak ve bunu her değişiklikten sonra yeniden endekslemek (ve bu yeni sonuçlar bir veya iki saniye içinde görünür). Az miktarda veri nedeniyle, bu işlem birkaç saniye sürebilir. Yine de ana veri kümesini düzenli olarak yeniden endekslemeniz gerekecektir (ne kadar düzenli olarak verilerinizin oynaklığına bağlıdır - her gün? Her saat?). Hızlı indeksleme hızları, tüm bunları oldukça ağrısız tutar.

Durumunuz için ne kadar uygulanabilir olduğu hakkında hiçbir fikrim yok, ancak Evan Weaver bazı Rails arama seçeneklerinden bazılarını (Sfenks, Ferret (Ruby için Lucene limanı) ve Solr) karşılaştırdı. Yararlı olabilir, sanırım.

MySQL'in tam metin aramasının derinliklerini doldurmadım, ancak Sphinx, Lucene veya Solr ile hızlı ve özellik açısından rekabet etmediğini biliyorum.


Sfenks, geçerli dizinlerdeki öğelerin ayrı ayrı özelliklerini güncellemenize izin verir, ancak tam kayıtları kaldırmaz / güncellemez.
Xorlev

sfenks RT kısmi güncelleme / kaldırma yapmanızı sağlar. erken aşamada ama zaten neredeyse çalışıyor. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
PQD

4
İşte Solr üzerine bir cevap, bu Sfenks bu cevaba iyi bir çift
Yeni İskenderiye

Hiçbir şey hız için Sfenks ile eşleşemez, bu nedenle hız bir numaralı endişenizse, Sfenks gitmek için bir seçenektir. Güzel yazı
twigg

Sfenks 2.3.2 Beta şimdi 'demek istediniz?' Uygulamak için kullanılabilecek 'CALL SUGGEST' adlı bir özelliğe sahip. sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K

82

Sfenks'i bilmiyorum, ancak Lucene'ye karşı veritabanı tam metin araması gelince, Lucene performansının eşsiz olduğunu düşünüyorum. Lucene dizininizi doğru bir şekilde ayarlamış olmanız koşuluyla, kaç kayıt aradığınıza bakılmaksızın 10 ms'den daha az bir sürede neredeyse tüm aramaları yapabilmeniz gerekir .

İşte en büyük engel şu: kişisel olarak, Lucene'in projenize entegre edilmesi kolay değil . Tabii, onu ayarlamak çok zor değil, böylece bazı temel arama yapabilirsiniz, ancak en iyi performansı elde etmek istiyorsanız, optimum performansla, o zaman kesinlikle Lucene hakkında iyi bir kitaba ihtiyacınız var.

CPU ve RAM gereksinimlerine gelince, Lucene'de bir arama yapmak CPU'nuzu çok fazla görevlendirmez, ancak verilerinizi endekslemek, bunu çok sık yapmamanıza rağmen (günde bir veya iki kez), bir engel var.

Tüm sorularınıza cevap vermez, ancak kısaca, aramak için çok fazla veriniz varsa ve harika bir performans istiyorsanız, o zaman Lucene'in kesinlikle yol olduğunu düşünüyorum. Aramak için o kadar fazla veriye sahip değilseniz, bir veritabanı tam metin araması için de gidebilirsiniz. MySQL tam metin araması ayarlamak kitabımda kesinlikle daha kolay.


10
Sfenks ile karşılaştırıldığında, lucence çok yavaş ve hantal. Her ikisini de projemde kullandım ve sonunda sfenkse bağlı kaldım. Lucence java'da ve Sphinx'ten çok daha fazla CPU ve RAM alıyor.
Phyo Arkar Lwin

25
Katılmıyorum. Doğru bir indeks oluşturursanız Lucene yıldırım hızındadır. Temel olarak yalnızca birkaç milisaniyede milyonlarca kayıt üzerinde gelişmiş bir sorgu yapabilirsiniz. Sadece ne yaptığını bilmen gerek. Lucene java'da ... ne demek istiyorsun? Ayrıca .NET portu var, Lucene.NET btw.
Razzie

15
ancak sfenks kullanmadığınızı ve v3sson'un ikisini de kullandığını açıkça söylediniz.
user508546

20
Sfenks kullanmadığınızı belirttiğiniz cümle ile lucene'nin performansının eşsiz olduğunu nasıl söyleyebilirsiniz?
user508546

22
Geçerli sorular. Lucene'in Sfenks'ten daha hızlı olduğunu söylemedim, Lucene'e karşı bir veritabanı tam metin araması eşleşmedi. Ve budur. Bununla ilgili soru yok. Lucene ters bir endekse dayanır. Şimdi daha önce de belirtildiği gibi Sfenks'i bilmiyorum, ama aynı zamanda ters bir indeks veya benzer bir indeksleme yöntemi kullanıyorsa, aynı şekilde performans göstermeleri mümkündür. Lucene'in Sfenks'e kıyasla 'çok yavaş ve hantal' olacağını belirtmek gerçeklere dayanmıyor. Özellikle sadece Lucene'nin 'Java'da olduğu söylenirken değil, bu performans açısından gülünç bir konudur.
Razzie

60

Solr hakkında daha fazla bilgi yayınlanmadığına şaşırdım. Solr, Sfenks'e oldukça benzer, ancak daha gelişmiş özelliklere sahiptir (Sfenks'i kullanmadığım için AFAIK - sadece okuyun).

Aşağıdaki bağlantıdaki cevap, Sfenks hakkında Solr için de geçerli olan birkaç şeyi detaylandırıyor. Tam metin arama motorunun karşılaştırılması - Lucene, Sfenks, Postgresql, MySQL?

Solr ayrıca aşağıdaki ek özellikleri sağlar:

  1. Çoğaltmayı destekler
  2. Birden çok çekirdek (bunları kendi yapılandırmaları ve kendi dizinleri ile ayrı veritabanları olarak düşünün)
  3. Boole aramaları
  4. Anahtar kelimelerin vurgulanması (regex-fu'nız varsa uygulama kodunda yapılması oldukça kolaydır; ancak, neden özel bir aracın sizin için daha iyi bir iş yapmasına izin vermiyorsunuz)
  5. Dizini XML veya sınırlandırılmış dosya ile güncelleme
  6. Arama sunucusuyla HTTP üzerinden iletişim kurun (Json, Native PHP / Ruby / Python'u bile döndürebilir)
  7. PDF, Word belgesi indeksleme
  8. Dinamik alanlar
  9. YÖNÜ
  10. Toplu alanlar
  11. Kelimeleri, eşanlamlıları vb. Durdurun.
  12. Bunun gibi daha...
  13. Özel sorgularla doğrudan veritabanından dizin oluşturma
  14. Otomatik öneri
  15. Önbellek Otomatik Isıtma
  16. Hızlı indeksleme (MySQL tam metin arama indeksleme sürelerine kıyasla) - Lucene ikili ters çevrilmiş indeks formatı kullanır.
  17. Destekleme (belirli bir anahtar kelimenin veya kelime öbeğinin alaka düzeyini artırmak için özel kurallar vb.)
  18. Alanlı aramalar (bir arama kullanıcısı, aramak istediği alanı biliyorsa, alanı, ardından değeri yazarak aramalarını daraltır ve SADECE bu alan her şeyden ziyade aranır - çok daha iyi bir kullanıcı deneyimi)

BTW, tonlarca özellik daha var; ancak, sadece üretimde kullandığım özellikleri listeledim. BTW, kutudan çıkar çıkmaz, MySQL yukarıdaki listede # 1, # 3 ve # 11 (sınırlı) 'yi destekler. Aradığınız özellikler için, ilişkisel bir veritabanı onu kesmeyecektir. Bunları hemen ortadan kaldırırdım.

Ayrıca, başka bir fayda Solr (aslında Lucene) bir belge veritabanı (örn. NoSQL) olmasıdır, bu nedenle diğer belge veritabanlarının birçok faydası Solr ile gerçekleştirilebilir. Başka bir deyişle, sadece aramadan çok daha fazlası için kullanabilirsiniz (yani Performans). Bununla yaratıcı olun :)


Sfenks de hakkında Çoğaltmayı destekler Çoklu çekirdekler Boole aramaları Anahtar sözcüklerin vurgulanması XML veya veya sınırlandırılmış dosya ile dizini güncelle - PDF, Word belgesi dizine ekleme (xml aracılığıyla) Facets Kelimeleri, eşanlamlıları vb. Durdurun. Özel sorgularla doğrudan veritabanından dizin oluşturma Otomatik öner Hızlı Dinamik Hakkında yarıştığı aramalar Arttırılması indeksleme Agrega Önbellek Autowarming sadece bilmiyorum alanları alanlar
Muş'a

58

Apache Solr


Apart OP'ın sorguları yanıtlayan gelen, bana bazı bilgiler atalım Apache Solr gelen basit bir giriş için ayrıntılı kurulum ve uygulanması .

Basit Giriş


Yukarıdaki arama motorları veya listede olmayan diğer motorlar ile deneyimi olan herkes - görüşlerinizi duymak isterim.

Solr gerçek zamanlı problemleri çözmek için kullanılmamalıdır. Arama motorları için Solr hemen hemen oyun ve kusursuz çalışıyor .

Solr , Yüksek Trafik web uygulamalarında iyi çalışır ( bunun için uygun olmadığı bir yerde okudum, ancak bu ifadeyi yedekliyorum ). CPU değil RAM kullanır.

  • sonuç alaka düzeyi ve sıralama

Boost sonuçlarınızın üst kısmında görünecek rütbe yardımcı olur. Söylesene, bir isim aramak için çalışıyoruz john alanlarına firstname ve lastname ve alaka vermek istediğiniz ad o zaman gerek sahada artırmak yukarı ad gösterildiği gibi sahadan.

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

Gördüğünüz gibi, ad alanı 2 puanla artırıldı .

SolrRelevancy hakkında daha fazlası

  • arama ve indeksleme hızı

Hız inanılmaz derecede hızlı ve bundan ödün verilmiyor. Solr'a taşınmamın nedeni .

Dizin oluşturma hızı ile ilgili olarak Solr , veritabanı tablolarınızdan JOINS'i de işleyebilir . Daha yüksek ve karmaşık bir birleşim indeksleme hızını etkiler. Bununla birlikte, muazzam bir RAM yapılandırması bu durumla kolayca başa çıkabilir.

RAM ne kadar yüksek olursa, Solr'un indeksleme hızı o kadar hızlı olur.

  • Django ile kullanım kolaylığı ve entegrasyon kolaylığı

Solr ve Django'yu asla entegre etmeye çalışmadı , ancak bunu Haystack ile başarabilirsiniz . Aynı ilginç bazı makaleler buldum ve işte bunun için github .

  • kaynak gereksinimleri - site bir VPS'de barındırılacaktır, bu nedenle ideal olarak arama motoru çok fazla RAM ve CPU gerektirmez

Solr RAM üzerinde ürer , bu yüzden RAM yüksekse, Solr hakkında endişelenmenize gerek yoktur .

Solr'ın RAM kullanımı, birkaç milyar kaydınız varsa tam indeksleme işlemine başlar, bu durumla başa çıkmak için Delta ithalatını akıllıca kullanabilirsiniz. Açıklandığı gibi Solr sadece gerçek zamanlıya yakın bir çözümdür .

  • ölçeklenebilirlik

Solr oldukça ölçeklenebilir. SolrCloud'a bir göz atın . Bazı temel özellikleri.

  • Kırıklar (veya kırma, dizinin birden fazla makine arasında dağıtılması konseptidir, dizininizin çok büyüyüp büyüymediğini söyleyin)
  • Yük Dengeleme ( Solrj , Solr bulut ile kullanılıyorsa, Round-Robin mekanizmasını kullanarak otomatik olarak yük dengeleme ile ilgilenir)
  • Dağıtılmış Arama
  • Yüksek kullanılabilirlik
  • "Bunu mu demek istediniz?", ilgili aramalar vb. gibi ekstra özellikler

Yukarıdaki senaryo için, Solr ile paketlenmiş SpellCheckComponent'i kullanabilirsiniz . Çok özellik vardır, SnowballPorterFilterFactory kayıtları yazdığınız takdirde, demek almak için yardımcı kitaplar yerine kitabında , sen ile ilgili sonuçlar sunulacaktır kitapta .


Bu cevap genel olarak Apache Solr ve MySQL'e odaklanmaktadır . Django kapsam dışı.

LINUX ortamında olduğunuzu varsayarsak, bu makaleye devam edebilirsiniz. (benimki bir Ubuntu 14.04 versiyonuydu)

Detaylı Kurulum

Başlangıç

İndir apache solr dan burada . Bu sürüm 4.8.1 . Yeni sürümleri indirebilirsiniz, bunu kararlı buldum.

Arşivi indirdikten sonra, seçtiğiniz bir klasöre çıkarın. Söyle .. Downloadsya da her neyse .. Yani böyle görünecekDownloads/solr-4.8.1/

İstendiğinde .. Dizinin içinde gezinin

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

Şimdi buradasınız ..

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

Jetty Uygulama Sunucusunu Başlatma

İskelesolr-4.8.1 dizinin örnekler klasörünün içinde bulunur , bu nedenle o dizinin içinde gezinin ve İskele Uygulama Sunucusunu başlatın.

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

Şimdi terminali kapatmayın, simge durumuna küçültün ve kenara bırakın.

(İPUCU: Jetty Server'ın arka planda çalışmasını sağlamak için & after.jar komutunu kullanın)

Apache Solr'un başarıyla çalışıp çalışmadığını kontrol etmek için tarayıcıda bu URL'yi ziyaret edin. http: // localhost: 8983 / Solr

İskele'yi özel bağlantı noktasında çalıştırma

Varsayılan olarak 8983 numaralı bağlantı noktasında çalışır. Bağlantı noktasını burada veya doğrudan jetty.xmldosyanın içinde değiştirebilirsiniz .

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

JConnector'ı indirin

Bu JAR dosyası MySQL ve JDBC arasında bir köprü görevi görür , Platformdan Bağımsız Sürüm'ü buradan indirin

İndirdikten sonra klasörü çıkarın ve kopyalayıp lib dizinine mysql-connector-java-5.1.31-bin.jaryapıştırın .

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

Apache Solr'a bağlanacak MySQL tablosunu oluşturma

Koymak için solr kullanımına, Sen aramak için bazı tablolar ve veri olması gerekir. Bunun için, kullanacağı MySQL rastgele isimler bir tablo oluşturma ve itmek için ve sonra biz kullanabiliriz solr bağlanmak için MySQL ve indeks tablosunun o ve 's girişleri.

1. masa yapısı

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. yukarıdaki tabloyu doldurun

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');

Çekirdeğe girmek ve lib direktiflerini eklemek

1. konumuna gidin

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

2. solrconfig.xml dosyasını değiştirme

Bu iki yönergeyi bu dosyaya ekleyin.

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

Şimdi DIH (Veri İçe Aktarma İşleyicisi) ekleyin

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

3. db-data-config.xml dosyasını oluşturun

Dosya varsa yoksay, bu satırları bu dosyaya ekleyin. İlk satırı görebileceğiniz gibi, MySQL veritabanınızın kimlik bilgilerini sağlamanız gerekir . Veritabanı adı, kullanıcı adı ve şifre.

<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>

(İPUCU: İstediğiniz sayıda öğeye sahip olabilir, ancak kimlik alanına dikkat edin, eğer bunlar aynıysa dizinleme atlanır.)

4. schema.xml dosyasını değiştirin

Bunu gösterildiği gibi schema.xml dosyasına ekleyin .

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

uygulama

indeksleme

Gerçek anlaşma burada. Sen verilerine endekslenmesini yapmanız gereken MySQL için Solr Solr Sorgularının yapmak kullanımına inorder.

Adım 1: Solr Yönetici Paneli'ne gidin

URL Hit : // localhost: 8983 / solr http tarayıcınızda. Ekran böyle açılır.

Bu ana Apache Solr Yönetim Paneli

İşaretçinin belirttiği gibi, yukarıdaki yapılandırmalardan herhangi birinin hatalara yol açıp açmadığını kontrol etmek için Günlük kaydı başlığına gidin .

2. Adım: Günlüklerinizi Kontrol Edin

Tamam şimdi buradasınız, yapabileceğiniz gibi çok sayıda sarı mesaj var (UYARILAR). Kırmızı ile işaretlenmiş hata mesajlarınızın olmadığından emin olun. Daha önce, bizim konfigürasyonumuza db-data-config.xml dosyasına bir seçme sorgusu ekledik , diyelim ki bu sorguda herhangi bir hata olsaydı, burada görünecekti.

Bu, Apache Solr motorunuzun günlüğe kaydetme bölümüdür

Güzel, hata yok. Gitmeye hazırız. En seçeyim koleksiyon1'i gösterildiği gibi listeden seçin Dataimport

Adım 3: DIH (Veri İçe Aktarma İşleyicisi)

DIH kullanarak, bağlanma olacak MySQL dan Solr yapılandırma dosyası aracılığıyla db-veri-config.xml gelen Solr arayüzü ve üzerine dizine alır veritabanından 10 kayıtları almak Solr .

Bunu yapmak için Tam içe aktarmayı seçin ve Temizle ve Tamamla seçeneklerini işaretleyin . Şimdi Yürüt'ü tıklayın gösterildiği gibi .

Alternatif olarak, bunun gibi doğrudan bir tam içe aktarma sorgusu da kullanabilirsiniz.

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

Veri İçe Aktarma İşleyicisi

Tıkladığınız sonra yürütme , Solr herhangi bir hata olup olmadığını, bu derdi, kayıtları endeksine başlar Dizin Başarısız ve geri dönmek zorunda Günlüğü gitti yanlış ne var görmek için bölüm.

Bu yapılandırmada herhangi bir hata olmadığı ve dizin oluşturma başarıyla tamamlandıysa, bu bildirimi alırsınız.

Endeksleme Başarısı

Adım 4: Solr Sorgularını Çalıştırma

Her şey yolunda gidiyor gibi görünüyor, şimdi endekslenen verileri sorgulamak için Solr Sorguları kullanabilirsiniz . Soldaki Sorgu'ya tıklayın ve ardından Yürüt'e basın altındaki düğmeye.

Dizinlenmiş kayıtları gösterildiği gibi göreceksiniz.

Tüm kayıtları listelemek için karşılık gelen Solr sorgusu

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

Endekslenmiş veriler

Endeksli 10 kaydın hepsi var. Diyelim ki, sadece Ja ile başlayan isimlere ihtiyacımız var , bu durumda sütun adını hedeflemeniz gerekir solr_name, bu nedenle sorgunuz böyle gider.

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

Ja * ile başlayan JSON verileri

Solr Sorgularını böyle yazarsınız . Bu konuda daha fazla okumak için, Bu güzel makaleye göz atın .


3
@Downvoter, bu yanıtı yorumlamak veya düzenlemek için çekinmeyin ve downvote için muhakeme başkalarına da yardımcı olacaktır.
Shankar Damodaran

4
Bu SO üzerinde gördüğüm en kapsamlı ve iyi organize edilmiş mesajlardan biridir. Harika iş.
dejenere

28

Şu anda PostgreSQL tam metin aramasına bakıyorum ve modern bir arama motorunun tüm doğru özelliklerine, gerçekten iyi genişletilmiş karaktere ve çok dilli desteğe, veritabanındaki metin alanlarıyla hoş sıkı entegrasyona sahip.

Ancak + veya AND gibi kullanıcı dostu arama operatörleri yoktur (& |! Kullanır) ve dokümantasyon sitesinde nasıl çalıştığı konusunda heyecan duymuyorum. Sonuç snippet'lerinde eşleşme terimlerinin kalın harflerle gösterilmesine rağmen, eşleşme terimlerinin büyük olmadığı varsayılan algoritma. Ayrıca, rtf, PDF, MS Office dizinini oluşturmak istiyorsanız, bir dosya formatı dönüştürücü bulmanız ve entegre etmeniz gerekir.

OTOH, MySQL metin aramasından çok daha iyi, bu da üç veya daha az harften oluşan kelimeleri bile dizine eklemiyor. MediaWiki araması için varsayılan ve son kullanıcılar için gerçekten iyi olmadığını düşünüyorum: http://www.searchtools.com/analysis/mediawiki-search/

Gördüğüm her durumda, Lucene / Solr ve Sfenks gerçekten harika . Sağlam kodlardır ve kullanılabilirlikteki önemli gelişmelerle gelişmiştir, bu nedenle araçlar neredeyse herkesi tatmin eden arama yapmak için vardır.

SHAILI - SOLR, Lucene arama kodu kütüphanesini içerir ve güzel bir bağımsız arama motoru olmak için bileşenlere sahiptir.


1
PostgreSQL ile tam metin aramasından bahsettiğinize inanıyorum Tsearch. Ancak Tsearch , kelime öbeği aramayı desteklemez. Hala TODO listesinde sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam

1
Sadece Postgres 9.0 tam metin aramasında bir sürü test yaptım; kullanıcı tüm aksanları doğru almayı unutursa Fransızca metnin eşleşmediğini hayal kırıklığına uğrattı. Kelime formlarının eşleştirilmesi düzensizdir - örneğin, İngilizce "say", "adı geçen" içeren metinle eşleşmez. Genel olarak test edilen diller arasında entegre bir özellik için oldukça etkileyici (en, fr, ru).
Roman Starkov

9
@romkyns: Bunları çıkarmak için belirsiz bir sözlük yüklemeniz gerekir.
Denis de Bernardy

2
"OTOH, MySQL metin aramasından çok daha iyi. Bu MySQL'in yerleşik bir kısıtlaması değildir - yapılandırma dosyasında ayarladığınız her şey budur. Tek harfli kelimeleri dizine eklemek istiyorsanız, yapılandırmadaki bir değeri değiştirmeniz yeterlidir.
Canuck

1
İnsanların henüz tam olarak araştırmadıkları veritabanlarıyla karşılaştırmalar yapmasından endişe ediyor. MySQL CAN üç karakter veya daha az olan endeks kelimeler - sadece düzgün bir şekilde ayarlamanız gerekiyor.
TheCarver

22

Bu çok eski soruya sadece iki sentim. Elastik Arama'ya göz atmanızı şiddetle tavsiye ederim .

Elasticsearch, Lucene tabanlı bir arama sunucusudur. RESTful web arayüzü ve şema içermeyen JSON belgeleri ile dağıtılmış, çok kullanıcılı özellikli tam metin arama motoru sağlar. Elasticsearch, Java'da geliştirilmiştir ve Apache Lisansı koşulları altında açık kaynak olarak yayınlanmıştır.

Diğer FTS (tam metin arama) Motorlarına göre avantajları:

  • RESTful arayüzü
  • Daha iyi ölçeklenebilirlik
  • Büyük topluluk
  • Lucene geliştiricileri tarafından tasarlandı
  • Kapsamlı belgeler
  • Çok sayıda açık kaynak kitaplığı var (Django dahil)

Bu arama motorunu projemizde kullanıyoruz ve çok mutluyuz.


10

SearchTools-Avi, "Üç veya daha az harften oluşan sözcükleri bile dizine eklemeyen MySQL metin araması" dedi.

FYIs, MySQL tam metin min kelime uzunluğu en az MySQL 5.0 beri ayarlanabilir . Basit talimatlar için Google 'mysql tam metin dk uzunluğu'.

Bununla birlikte, MySQL tam metninin sınırlamaları vardır: Birincisi, bir milyon kayda ulaştığınızda güncellenmesi yavaşlar, ...


2

Listeye mnoGoSearch eklerdim . Google gibi çalışan son derece performanslı ve esnek bir çözüm: dizin oluşturucu birden fazla siteden veri alır, Temel ölçütleri kullanabilir veya maksimum arama kalitesi için kendi kancalarınızı icat edebilirsiniz. Ayrıca doğrudan veritabanından veri getirebilir.

Çözüm bugün pek bilinmemektedir, ancak maksimum ihtiyaçları karşılamaktadır. Derleme ve bağımsız sunucu üzerinde, hatta ana sunucunuzda derleyebilir ve kurabilirsiniz, C'de yazıldığı ve küçük sunucularda bile mükemmel çalıştığı için Solr kadar fazla kaynak gerektirmez.

Başlangıçta Kendiniz derlemeniz gerekir, bu yüzden biraz bilgi gerektirir. Debian için yardımcı olabilecek küçük bir senaryo hazırladım. Herhangi bir ayar bekliyoruz.

Django framework kullandığınızda, ortasından veya PHP istemcisini kullanabilir veya Python'da bir çözüm bulabilirim, bazı makaleler gördüm .

Ve elbette mnoGoSearch açık kaynak kodlu, GNU GPL.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.