2009-08-20 15 views
9

Filmler ve dizilerden oluşan bir veritabanımız var ve veriler çeşitli güvenilirlik kaynaklarından geldiği için, bölümlerin başlıklarında bulanık dize eşleştirmesi yapmak istiyoruz. Bizim uygulamada arama için Solr kullanıyoruz, ancak varsayılan eşleme mekanizmaların-gramlar Solr ile yaklaşık eşleştirme nasıl kullanılır?

gibi kısa dizeler için yeterince iyi olmayan sözcük düzeyleri üzerinde çalışır, n-gramları geçmişte yaklaşık eşleme kullanmıştım ve Lucene (ve Solr) 'un bu kutunun dışında bir şeyi desteklediğini görmekten çok mutluyum. Maalesef, doğru bir şekilde yapılandıramadım.

ben bunun için özel bir alan türünü ihtiyaç olduğu kabul yüzden benim schema.xml için saha tipi aşağıdaki ekledi:

<fieldType 
    name="trigrams" 
    stored="true" 
    class="solr.StrField"> 
<analyzer type="index"> 
    <tokenizer 
     class="solr.analysis.NGramTokenizerFactory" 
     minGramSize="3" 
     maxGramSize="5" 
     /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
</fieldType> 

ve şemadaki uygun alanı değişti:

Bununla birlikte, beklediğim gibi çalışmıyordur. Sorgu analizi doğru görünüyor, ancak hiçbir sonuç alamıyorum, bu bana öğesinin bir dizin saatinde gerçekleştiğine inanıyor (yani başlık, trigram alanı yerine varsayılan dize alanı gibi dizinlenmiş).

ben çalışıyorum sorgu

title:"guy walks into a psychiatrist office" 
(yazım hatası yaparak veya iki)

gibi bir şey olduğunu ve "Guy Ruh hekimi Ofisi içine yürür" aynı olmalıdır.

(sorgu doğruysa gerçekten emin değilim.)

Üstelik ben aslında bir şey daha yapabilmek istiyorum. dizgesini altdizlemek, tüm noktalama işaretlerini ve boşlukları kaldırmak, İngilizce sözcüklerini kaldırmak ve daha sonra dizeyi trigram olarak değiştirmek istiyorum. Ancak, filtreler yalnızca dizgenin belirtilenden sonra uygulandıktan sonra ...

Yanıtlarınız için şimdiden teşekkür ederiz.

+0

kullandığınız sorgu gönderebilir miyim? – olle

+0

Soruyu bir örnek sorgu içerecek şekilde düzenledim. –

cevap

3

Çözüm çok basit çıktı: AND varsayılan operatör olarak ayarlandı ve ngramlardan herhangi biri eşleşmediyse, tüm sorgu başarısız oldu. Bu nedenle, şema tanımımda

eklenmesi yeterliydi.

+5

Cevabınız, sorunun ngramlarla hiçbir ilgisi olmadığını belirtti. Ben haklı mıyım –

+2

@RyszardSzopa 'OR', meydan okuyucusu olarak n-gram analizi ile aynı değildir. 'OR' çok sayıda sonuç verir, ancak genellikle oldukça kötü sonuçlar verir. –

9

Sorunuzun son bölümüne yanıt vermek için: solr ayrıca bir ngram filtresine de sahiptir. Yani bütün ön Ngram filtre uygulayabilir, Ngram dizgeciklerini (ama örneğin "WhitespaceTokenizer" gibi bir tane) kullanın ve daha sonra ekleme olmamalıdır bu bir:

<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />