Lucene'de, alanlı bir metni aramak için TermQuery'yi kullanabiliriz. Bir gruptaki veya tüm aranabilir alanlardaki bir anahtar kelimeyi nasıl arayacağımı merak ediyorum.Tüm alanlar arasında nasıl arama yapılır?
cevap
İki
1) Endeksi zamanlı bir yaklaşım yaklaşır: Bir tümünü yakalama alanını kullanın. Bu, tüm alanlardan (giriş belgenizden toplam metin) tüm metni eklemeye ve tek bir alanda büyük metinlere neden olan bir yere eklemekten başka bir şey değildir. Tümünü yakalama alanı olarak hareket etmek için dizin oluştururken ek bir alan eklemelisiniz.
2) Arama zamanı yaklaşımı: Örneğin, TermQuery örnekleri gibi birden çok soruyu birleştirmek için BooleanQuery kullanın. Tüm hedef alanları kapsayacak şekilde çoklu sorgular oluşturulabilir. Makalenin sonundaki
Çalışma zamanında hedef alan listesini biliyorsanız, yaklaşım 2'yi kullanın. Aksi halde, 1. yaklaşımı kullanmalısın.
Zaten sahip olduğunuzdan başka bir şeyi dizine eklemeyi gerektirmeyen başka bir yaklaşım veya farklı sorguları birleştirmek için MultiFieldQueryParser
kullanıyor.
Arama yapmak istediğiniz alanların ve sorgunuzun bir listesini sağlayabilirsiniz, hepsi bu.
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
Version.LUCENE_41,
new String[]{"title", "content", "description"},
new StandardAnalyzer(Version.LUCENE_41));
Query query = queryParser.parse("here goes your query");
Bu, Java'da yazılmış orijinal lucene kitaplığı ile bunu nasıl yaparım. Ben de MultiFieldQueryParser
'un lucene.net'de mevcut olup olmadığından emin değilim.
"MultifieldQueryParser" kullanarak tüm alanlarda arama yapmak için başka bir kolay yaklaşım, IndexReader.FieldOption.ALL sorgunuzu kullanmaktır.
Örnek olarak C# örneğidir.
Directory directory = FSDirectory.Open(new DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath)));
//get analyzer
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
//get index reader and searcher
IndexReader indexReader__1 = IndexReader.Open(directory, true);
Searcher indexSearch = new IndexSearcher(indexReader__1);
//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method
dynamic queryParser = new MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer);
dynamic query = queryParser.Parse(Criteria);
TopDocs resultDocs = null;
//perform search
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc());
dynamic hits = resultDocs.scoreDocs;
vb.net aynı quesiton iyi büyük resmi açıklama için
Burada ördek yazmayı kullanma noktasını göremiyorum (yani, "dinamik" anahtar sözcüğü). Belki de tür varyasyonunu "var" ile kullanmak isterdiniz? –
Teşekkür benim geçirgen cevabı kontrol etmek. İlk yaklaşım, farklı indeks türlerini aynı indekste saklarken kullandığım, örneğin her dokümanda farklı alanların olduğu Monitörler ve Monitörler, ancak basit bir arama dizisiyle "tam metin" aramayı kullanmak ve geri getirmek istiyorum. eşleşen ürünler. – nothingisnecessary