Setelah beberapa hari sibuk bekerja, saya akhirnya menerapkan pencarian teks lengkap sederhana. Izinkan saya meninjau dan merangkum
artikel ini. Apa yang bisa Lucene.Net lakukan? Dan pertanyaannya bagaimana melakukannya? Terakhir, diberikan contoh Lucene.Net yang mengimplementasikan pencarian teks lengkap.
1. Apa itu Lucene.Net?
Lucene.net awalnya merupakan proyek sumber terbuka dan kemudian beralih ke komersialisasi. Lucene.net 2.0 juga telah dirilis, tetapi demi uang D. Nasib Lucene.net agak mirip dengan FreeTextBox, yang dimulai dengan 2.0 dirilis setelah versi 1.6. 5. Rute komersial, 2.0 menyediakan versi gratis dalam bentuk DLL, dan versi kode sumber harus membeli lisensi komersial; namun, meninggalkan kode sumber versi 1.6.5, dan Anda masih dapat melihat sebagian besar detail internal , tetapi di versi 2.0 Dukungan tambahan untuk browser Mozilla hanya terlihat melalui skrip HTML dan JavaScript yang dihasilkannya.
Lucene adalah API pengindeksan yang umum digunakan di dunia Java. Dengan menggunakan metode yang disediakannya, Anda dapat membuat indeks untuk materi teks dan menyediakan pengambilan. (Referensi: NLucene dan Lucene .NET) NLucene adalah port .net pertama dan versi gaya .net yang menggunakan konvensi penamaan .net dan desain perpustakaan kelas. Namun karena alasan energi, pemimpin proyek NLucene hanya merilis versi 1.2beta. Setelah proyek Lucene.NET muncul, tidak ada rencana baru untuk NLucene.
Lucene.NET awalnya diklaim sebagai transplantasi .net Lucene terkini. Ia hanya mengadopsi saran .net dalam hal penamaan. Tujuan utamanya cenderung kompatibel dengan Java Lucene: salah satunya adalah membuat format indeks kompatibel sehingga mereka dapat bekerja sama. Tujuan pertama adalah agar penamaannya mirip (dengan hanya sedikit perbedaan, seperti huruf besar dan kecil, dll.), dan tujuannya adalah untuk memfasilitasi pengembang dalam menggunakan kode dan informasi terkait Java Lucene.
Saya tidak tahu kapan proyek Lucene.NET menghentikan rencana open source dan beralih ke bisnis. Itu sebenarnya menghapus file sumber terbuka di SourceForge. Pada saat yang sama, proyek dotLucene muncul di SourceForge. Sebagai protes terhadap Lucene.NET, dotLucene hampir menjadikan kode Lucene.NET utuh sebagai titik awalnya. ( https://sourceforge.net/forum/forum.php?thread_id=1153933&forum_id=408004 ).
Terus terang, Lucene.Net adalah perpustakaan fungsi pengambilan informasi (Perpustakaan). Anda dapat menggunakannya untuk menambahkan fungsi pengindeksan dan pencarian ke aplikasi Anda.
Pengguna Lucene tidak perlu memiliki pengetahuan mendalam tentang pengambilan teks lengkap, tapi hanya belajar menggunakan perpustakaan. Jika Anda tahu cara memanggil fungsi di Perpustakaan, Anda dapat mewujudkan fungsi pencarian teks lengkap untuk aplikasi Anda.
Tapi jangan berharap Lucene menjadi mesin pencari seperti Google dan Baidu sebuah alat, Perpustakaan. Anda juga dapat menganggapnya sebagai API sederhana dan mudah digunakan yang merangkum fungsi pengindeksan dan pencarian. Anda dapat melakukan banyak hal terkait pencarian dengan API ini, dan ini sangat nyaman dan bisa memenuhi kebutuhan Anda. Sebuah aplikasi melakukan pencarian teks lengkap sederhana. Sebagai pengembang aplikasi (pengembang mesin pencari non-profesional), fungsinya cukup untuk memuaskan Anda.
2. Apa yang bisa dilakukan Lucene.Net?
Lucene dapat mengindeks dan mencari data apa pun. Terlepas dari format sumber datanya, selama dapat diubah menjadi teks, maka dapat dianalisis dan dimanfaatkan oleh Lucene other Segala bentuk file dapat digunakan oleh Lucene selama Anda dapat mengekstrak konten teks darinya. Anda dapat menggunakan Lucene untuk mengindeks dan mencarinya
3. Bagaimana cara menggunakan Lucene.Net?
Intinya adalah: membuat indeks, dan menggunakan indeks. Membuat indeks adalah menyimpan atau menganalisis informasi sumber data yang akan dicari sebagai informasi utama kita, dan meninggalkan tanda untuk pencarian itu seperti membuat tabel. konten di Word (pemahaman pribadi), menggunakan indeks adalah menganalisis sumber data berdasarkan informasi indeks selama pencarian dan mengekstrak informasi yang kita butuhkan.
Silakan lihat contoh:
IntranetIndexer kelas publik
untuk membuat indeks
{
/**/////Penulis indeks
private IndexWriter writer;
//Direktori root dari file yang akan ditulis ke indeks
string pribadi docRootDirectory;
//Format file yang cocok
string pribadi[] pola;
/**//// <ringkasan>
/// Inisialisasi penulis indeks. Direktori adalah direktori tempat indeks dibuat. true artinya jika file indeks tidak ada maka file indeks akan dibuat kembali ditimpa.
/// </ringkasan>
/// <param name="directory">Direktori yang akan diindeks diteruskan. Perhatikan bahwa ini adalah nilai string. Jika direktori tidak ada, maka akan dibuat secara otomatis</param>
publicIntranetIndexer (direktori string)
{
writer = new IndexWriter(direktori, new StandardAnalyzer(), true);
penulis.SetUseCompoundFile(benar);
}
public void AddDirectory (direktori DirectoryInfo, pola string [])
{
this.docRootDirectory = direktori.Nama Lengkap;
this.pattern = pola;
addSubDirectory(direktori);
}
private void addSubDirectory (direktori DirectoryInfo)
{
for(int i=0;i<pola .Panjang ;i++)
{
foreach (FileInfo fi di direktori.GetFiles(pola[i]))
{
AddHtmlDocument(fi.Nama Lengkap);
}
}
foreach (DirectoryInfo di direktori.GetDirectories())
{
addSubDirectory(di);
}
}
public void AddHtmlDocument (jalur string)
{
string exname=Path.GetExtension (jalur);
Dokumen doc = Dokumen baru();
string html;
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm"||exname .ToLower ()==".txt")
{
menggunakan(StreamReader sr=new StreamReader (jalur,Sistem .Teks .Encoding .Default ))
{
html = sr.ReadToEnd();
}
}
kalau tidak
{
menggunakan (StreamReader sr = new StreamReader(path, System.Text.Encoding.Unicode ))
{
html = sr.ReadToEnd();
}
}
int relativePathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length : this.docRootDirectory.Length + 1;
string relativePath = jalur.Substring(relativePathStartsAt);
string title=Jalur.GetFileName(jalur);
//Tentukan apakah itu halaman web, hapus tagnya, jika tidak, jangan gunakan
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm")
{
doc.Add(Field.UnStored("text", parseHtml(html)));
}
kalau tidak
{
doc.Add (Bidang .UnStored ("teks",html));
}
doc.Add(Field.Keyword("path", relativePath));
//doc.Add(Field.Text("judul", getTitle(html)));
doc.Add (Bidang .Teks ("judul",judul));
penulis.AddDocument(doc);
}
/**//// <ringkasan>
/// Hapus tag dari halaman web
/// </ringkasan>
/// <param name="html">Halaman web</param>
/// <returns>Mengembalikan teks halaman web yang dihapus</returns>
string pribadi parseHtml(string html)
{
string temp = Regex.Replace(html, "<[^>]*>", "");
return temp.Replace(" ", " ");
}
/**//// <ringkasan>
/// Dapatkan judul halaman
/// </ringkasan>
/// <param nama="html"></param>
/// <pengembalian></pengembalian>
string pribadi getTitle(string html)
{
Cocokkan m = Regex.Match(html, "<title>(.*)</title>");
if (m.Grup.Hitungan == 2)
kembalikan m.Grup[1].Nilai;
return "Judul dokumen tidak diketahui";
}
/**//// <ringkasan>
/// Optimalkan indeks dan tutup penulis
/// </ringkasan>
kekosongan publik Tutup()
{
penulis.Optimalkan();
penulis.Tutup();
}
}
Pertama-tama buat objek Dokumen, lalu tambahkan beberapa atribut Bidang ke objek Dokumen. Anda dapat menganggap objek Dokumen sebagai file virtual, yang darinya informasi akan diperoleh di masa mendatang. Bidang tersebut dianggap sebagai metadata yang menjelaskan file virtual ini . Diantaranya Bidang mencakup empat jenis:
Data Keywork jenis ini tidak akan dianalisis, tetapi akan diindeks dan disimpan dalam indeks.
Tidak Terindeks
Data jenis ini tidak akan dianalisis atau diindeks, tetapi akan disimpan dalam indeks.
Tidak Tersimpan
Kebalikan dari UnIndexed, ia dianalisis dan diindeks, namun tidak disimpan.
Teks
Mirip dengan UnStored. Jika tipe nilainya adalah string, maka akan disimpan. Jika tipe nilainya adalah Reader, maka tidak akan disimpan, sama seperti UnStored.
Terakhir, setiap Dokumen ditambahkan ke indeks.
Berikut penelusuran indeksnya
//Buat pengindeks
Pencari IndexSearcher = IndexSearcher baru (indexDirectory);
// Parsing bidang teks indeks untuk pencarian
Kueri kueri = QueryParser.Parse(this.Q, "text", new StandardAnalyzer());
//Masukkan hasil pencarian ke dalam hits
Hits hits = pencari.Pencarian(kueri);
//Statistik jumlah total rekaman yang dicari
this.total = hits.Panjang();
//Menyorot
Penyorot QueryHighlightExtractor = new QueryHighlightExtractor(query, new StandardAnalyzer(), "<font color=red>", "</font>");
Langkah pertama adalah menggunakan IndexSearcher untuk membuka file indeks untuk pencarian selanjutnya, dan parameternya adalah jalur file indeks.
Langkah kedua adalah menggunakan QueryParser untuk mengonversi pernyataan kueri yang lebih mudah dibaca (seperti kata kueri lucene, dan beberapa lainnya)
.metode lanjutan lucene AND.net) ke dalam objek kueri yang digunakan secara internal oleh Lucene.
Langkah ketiga melakukan pencarian dan mengembalikan hasilnya ke koleksi hits. Perlu dicatat bahwa Lucene tidak memasukkan semua hasil ke dalam hits sekaligus tetapi menempatkannya Untuk pertimbangan ruang,
hasil pencarian kemudian diproses dan ditampilkan pada halaman:
for (int i = startAt; i < resultsCount; i++)
{
Dokumen doc = hits.Doc(i);
string jalur = doc.Get("jalur");
string lokasi =Server.MapPath("dokumen")+" \"+jalur ;
string exname=Path.GetExtension (jalur);
string teks biasa;
string str=doc.Dapatkan("judul");
if(exname==".html" || exname ==".htm" || exname ==".txt")
{
menggunakan (StreamReader sr = new StreamReader(lokasi, System.Text.Encoding.Default))
{
plainText = parseHtml(sr.ReadToEnd());
}
}
kalau tidak
{
menggunakan (StreamReader sr = new StreamReader(lokasi, System.Text.Encoding.Unicode ))
{
plainText = sr.ReadToEnd();
}
}
//DataTable menambahkan baris
Baris DataRow = ini.Hasil.NewRow();
baris["judul"] = doc.Get("judul");
string IP=Request.Url.Host;//Dapatkan IP server
//Permintaan.Url.Port;
baris["jalur"]=@" http://"+IP+"/WebUI/Search/documents/"+jalur ;
baris["sampel"] = highlighter.GetBestFragments(plainText, 80, 2, "");
this.Hasil.Baris.Tambahkan(baris);
}
searcher.Close();//Close the searcher Jika Anda ingin memiliki pemahaman yang lebih maju, komprehensif dan mendalam tentang Lucene.Net, silakan merujuk ke website:
http: //blog.tianya.cn/blogger/view_blog.asp?BlogName=aftaft