2011-11-10 28 views
5

tam metin Lucene, tüm aday kimliğini lucene dizininden döndürecek ve adayı sorguya koyduğum kimliği belirleyip sonucuNHibernate + SqlServer Daha önce ben Lucene.Net</p> ben tam metin sorgu için aday</p> <p>adında bir tabloya sahip <p>kullanıyorum operasyon sonrasında İçin NHibernate</p> <p>Tam metin araması yapmak zorunda arama

döndürecektir. Fakat sorun 10'dan fazla aday özgeçmişinin mevcut olmaması nedeniyle Lucene çok yavaş Filtre 10 Lk satırdan değer ve aday filtre tekrar aday karşı sorguda için dönüş değeri koymak ve aynı zamanda ben bir çağrı kriterlerine sahip ve her sayfa için ben 100 adayın

şimdi yeni eklenen dönmek çok fazla zaman

alıyor tablo 2000 şimdi ben DetachedCriteria Ve tek sorguda yapmak zorunda

1) Select candidate with some filters 

2) Execute the function ContainsTable for candidate_full_text table 
(which returns candidate tables id as key and rank of occurrence of the search string) 

3) join the result from 1 & 2 

4) Apply paging criteria (ie return 1st 100,2nd 100,3rd 100.. etc) according to page no 

5) return the result by order of rank column (which is return by ContainsTable) 

ardından şeyleri şöyle NHibernate DetachedCriteria kullanarak sorgulamak istiyorum ben SQLSunucusu tam metin dizini yapılandırılmış söz konusu tabloda candidate_full_text int,

Ad - - varchar

Dob candidate_full_text endeksi için anahtar sütun aday tabloları id .. İşte ben verilen 1) adayın masa modelleri (Min alanlar)

Kimliği - datetime,

2) candidate_full_text

id - int,

candidate_resume_full_text -ntext, (yapılandırılmış tam metin endeksi)

candidate_id - yerine Lucene SQL Server FTS kullanabilirler ve performans yeteneği yararlanabilir, kabul edilebilir ise

+2

Tam metin aramada, özellikle Sql Server 2000'de değil, lucene'den daha hızlı olmaya değmezdim. Lucene, büyük veri miktarları için bile çok hızlıdır. Gerekli tüm verileri lucene koyarak IN sorgusunu ortadan kaldırmayı düşündünüz mü, Sql sunucusuna tamamen girmekten kaçınıyorsunuz? –

+0

Ben teknik veriden ziyade daha mantıklı için sqlserver tam metin arama için gidiyorum ... Ben nhibernate kullanarak orm im kullanarak çünkü lucene tüm verileri koyamıyorum ... Ben sadece bir amaç için lucene kullanarak tam metin arama – Anand

+0

Ben katılıyorum Jonas, Lucene'nin genel olarak SQL FTS'den çok daha performanslı bir çözüm olduğunu söyledi. Bununla birlikte, eğer SQL FTS'nin performansı yeterli ise, bunu kullanmak, FTS sonuçlarının (CONTAINSTABLE veya FREETEXTTABLE işlevleri aracılığıyla) diğer ilişkisel verilere ilişkisel olarak katılabilmesinin yararını sağlar, böylece gerçekten karmaşık filtreleme ve gruplama yapmak çok daha kolay hale gelir . –

cevap

2

int SQL Server FTS sonuçları ve veritabanınızdaki diğer ilişkisel veriler arasındaki ilişkisel birleştirme yapın. Bu birleşimleri yapmak için, CONTAINS yüklemi yerine CONTAINSTABLE işlevini kullanmalısınız.

<sql-query name="CandidateSearch"> 
    <![CDATA[ 
    SELECT TOP (:take) * 
     FROM 
      (SELECT c.Id, c.Name, ft.[RANK], ROW_NUMBER() OVER(ORDER BY ft.[RANK] desc) as rownum   
      FROM ContainsTable(Candidate_full_text, candidate_resume_full_text , :phrase, LANGUAGE 1033) ft 
         INNER JOIN Candidate c on ft.[KEY] = c.Id 
      WHERE c.Name = :name and c.Dob > :dob 
      ) a 
     WHERE a.rownum > :skip ORDER BY a.rownum 
    ]]> 
</sql-query> 

Not bu nasıl: Bu durumda, bu satırlar boyunca nHibernate şey bir parametreli adlı sorgusu oluşturabilirsiniz

create table Candidate 
( 
Id int primary key, 
Name varchar(50), 
Dob datetime 
) 

create table Candidate_Full_Text 
(
id int primary key, 
candidate_resume_full_text ntext, -- FTS column 
candidate_id int foreign key references Candidate(Id) 
) 

: En örneği kullanarak

, SQL Server aşağıdaki tabloları kurmak izin Sorgu ilişkisel olarak CONTAINSTABLE işlevinin sonuçlarını veritabanınızdaki diğer tabloya birleştirir. SQL FTS kullanarak, DB'nizdeki diğer veriler üzerinde karmaşık ilişki sorguları ile FTS sonuçlarına katılmak kolaydır. Bu özellik, Lucene üzerinden SQL Server FTS kullanmanın en önemli avantajlarından biridir ve daha düşük genel performansa rağmen Lucene üzerinden seçim yapmak için bir neden olabilir.

Son olarak, C# uygulamasında parametreleri girip nHibernate ISession nesnesini kullanarak sorguyu çalıştırabilirsiniz:

 int take = 5; 
     int skip = 10; 
     string phrase = "(team NEAR player) OR (teamwork NEAR coopertive)"; 
     string name = "John Doe"; 
     DateTime dob = new DateTime(1963, 7, 1); 

     var results = _session.GetNamedQuery("ExpandedSearchTerm") 
           .SetString("phrase", phrase) 
           .SetDateTime("dob", dob) 
           .SetString("phrase", phrase) 
           .SetInt32("take", take) 
           .SetInt32("skip", skip) 
           .List(); 

RowNumber() fonksiyonu kullandığınız SQL Server 2000, kullanılamaz Ancak bence çağrı yapmak için başka işler var (bkz. örneğin, this article). (Veya SQL Server'ınızı 2008'de FTS'yi çalıştıran ve daha iyi bir performansa sahip olan sürümüne yükseltmek isteyebilirsiniz!)

Bu hatlar boyunca bir çözüm ihtiyaçlarınızı karşılayacaktır.