2009-08-08 13 views
14

Lucene kullanarak eş anlamlıları (deyimler) işlemenin en iyi yolu nedir? Özellikle, aşağıdaki gibi sorguları çalıştırmam gerektiğinde: a VEYA b VEYA d DEĞİL dLucene kullanarak benzer kelimeler

Dizin oluştururken her belgeye "eşanlamlılar" adı verilen yeni bir alan ekleme hakkında ne dersiniz? Bu alanın değeri, tüm eş anlamlıların bir listesini olurdu. Bir belgeye, yalnızca bu belgenin eş anlamlılardan herhangi biri olduğunda eklenir.

O zamanlar bir "OR" diğer alanlarla birlikte bu alanda arama anahtar kelime için olmazdı arama sorgusu yürütmek istiyorum.

Bu yaklaşım her türlü sorgu için iyi çalışır mı?

Bilginize, benim uygulamada eş tamamen özel değil, İngilizce sözlükte ... yani gelmektedir. "Finans Küresel Lider" de

önermek Lütfen "Top Yatırım Bankası" veya "Fortune 500 Finans şirketi" vs vs anlamına gelebilir.

Teşekkürler.

cevap

11

"wordnet" adı verilen Lucene projesine bir katkı var. its documentation göre:

Bu paket da sorgu genişletme için kullanılabilir bunları saklamak lucene indeksi oluşturmak için WordNet'in tarafından tanımlanan eş anlamlılarını kullanır. Normalde, sorgu dizinini/"veritabanını" oluşturmak için Syns2Index'i çalıştırır ve bir sorguyu genişletmek için SynExpand.expand (...) 'ı çağırırsınız.

sorguda geçerseniz

"büyük köpek" o zaman yazdırır::

Sorgu: big adult^0.9 bad^0.9 bighearted^0.9 boastful^0.9 boastfully^0.9 bounteous^0.9 bountiful^0.9 braggy^0.9 crowing^0.9 freehanded^0.9 giving^0.9 grown^0.9 grownup^0.9 handsome^0.9 large^0.9 liberal^0.9 magnanimous^0.9 momentous^0.9 openhanded^0.9 prominent^0.9 swelled^0.9 vainglorious^0.9 vauntingly^0.9 dog andiron^0.9 blackguard^0.9 bounder^0.9 cad^0.9 chase^0.9 click^0.9 detent^0.9 dogtooth^0.9 firedog^0.9 frank^0.9 frankfurter^0.9 frump^0.9 heel^0.9 hotdog^0.9 hound^0.9 pawl^0.9 tag^0.9 tail^0.9 track^0.9 trail^0.9 weenie^0.9 wiener^0.9 wienerwurst^0.9

You

O ne yaptığının bir örneğini içerir Orijinal kelimelerin ("büyük" ve "köpek") onlara bağlı hiçbir ağırlığa sahip olmadığını gör. Bununla birlikte, eş anlamlılar kendinizi yapılandırabileceğiniz bir ağırlıklandırmaya (0.9) sahiptir.

O "katkı" dizininde Lucene standart dağıtım, ile birlikte geliyor.

+0

Ur girdiler için teşekkürler Adam ... Lütfen tekrar soruma tekrar bakar mısınız? Şimdi düzenledim. –

+1

WordNet modülü, tıpkı sizin gibi bir Lucene dizini oluşturur. Oluşturduğu bu dizin sonunda sorguları genişletmek için kullanılır. Bu dizini sadece WordNet'in sözlüğünden oluşturmayı denediyseniz, indeks için hangi alan adlarını kullandığını kolayca söyleyebilir ve kendi özel girişlerinizi kendiniz ekleyebilirsiniz. –

0

Ben bütün ifade girmiş ve kilo şey aramaların sonraki dizi daha ağır dönen kullanarak bir arama çalıştırmak tercih ederler. Daha sonra ifade içindeki her kelimeyi yinelemeyi ve bu sonuçları daha düşük bir puan alarak aramayı severim. Daha sonra, bir kereden fazla iade edilen tüm kalemlerin puanlarını topladım ve sonuçları buna göre sıralarım. Bunu yapmanın en iyi yolu% 100 olmayabilir ... ama geçmişte benim için harika çalıştı.

1

Sorgu nesnesini QueryParser.parse() ile ayrıştırdıktan sonra Query nesnesini alabilirsiniz.

vakaların çoğunda

, üst düzey sorgu onun çocukları olarak alt sorgu ile boolean sorgusu olur. Sorgu nesnesinde yinelemeli yineleme yapabilirsiniz. Bir TermQuery veya PhraseQuery nesnesini vurduğunuzda, (alt) sorguyu alabilir ve bu sorgu nesnesini, varsa eş anlamlılarından oluşan bir boole sorgu nesnesiyle değiştirebilirsiniz.

Esasen, sadece yeni sorgu ile sorgu yaprak düğümleri yerini sağlamak ve keman yok

a OR b AND c 

sorgu nesneye Çalışma

(a OR synA) OR (b OR synB1 OR synB2) AND c 

orijinal sorgu dönüştüren rasgele karmaşık sorgu hiyerarşisi ile.