Rumah > Java > javaTutorial > Menggunakan Apache Lucene untuk pemprosesan carian teks penuh dalam pembangunan API Java

Menggunakan Apache Lucene untuk pemprosesan carian teks penuh dalam pembangunan API Java

WBOY
Lepaskan: 2023-06-18 18:11:05
asal
1562 orang telah melayarinya

Dengan peningkatan jumlah data Internet, cara mencari data dengan cepat dan tepat telah menjadi isu penting. Sebagai tindak balas kepada masalah ini, enjin carian teks penuh telah muncul Apache Lucene adalah salah satu perpustakaan enjin carian teks penuh sumber terbuka, sesuai untuk aplikasi yang disepadukan dengan bahasa pengaturcaraan Java. Artikel ini akan memperkenalkan cara menggunakan Apache Lucene untuk pemprosesan carian teks penuh dalam pembangunan API Java.

1. Pengenalan kepada Apache Lucene

Apache Lucene ialah perpustakaan enjin carian teks penuh Ia adalah pustaka enjin carian berprestasi tinggi, berciri penuh dan mudah digunakan Jawa. Ia boleh mengindeks sejumlah besar data teks dan memberikan hasil carian yang cekap, tepat dan pantas. Lucene menggunakan teknologi pengindeksan berasaskan cakera untuk memisahkan data teks kepada berbilang perkataan dan kemudian menyimpannya dalam jadual indeks terbalik. Jadual indeks terbalik menggunakan hubungan antara perkataan dan dokumen untuk menunjukkan perkataan ke dokumen di mana perkataan itu berada. Semasa proses pertanyaan, jadual indeks terbalik mencari dokumen mengikut perkataan dan mengembalikannya sebagai hasil pertanyaan.

2. Komponen teras Lucene

Lucene terdiri daripada berbilang komponen teras. Komponen ini bekerjasama untuk melaksanakan enjin carian teks penuh berprestasi tinggi, termasuk:

  1. Penganalisis

Anaylzer digunakan untuk memisahkan data teks kepada berbilang Selain membahagikan teks ke dalam perkataan, penganalisis perkataan juga boleh digunakan untuk menapis perkataan henti, melakukan penukaran kes, dsb.

  1. IndexWriter (penulis indeks)

IndexWriter digunakan untuk menukar data teks kepada jadual indeks, membina jadual indeks terbalik dan mengekalkannya ke cakera . Apabila data perlu dicari, data boleh dicari dengan cepat dari jadual indeks.

  1. IndexReader (pembaca indeks)

IndexReader digunakan untuk membaca jadual indeks dari cakera dan memuatkannya ke dalam memori. Data dimuatkan daripada memori, jadi pertanyaan data adalah sangat pantas.

  1. Pertanyaan (Pertanyaan)

Pertanyaan digunakan untuk menukar rentetan yang dimasukkan oleh pengguna ke dalam keadaan carian dan mencari data dengan cepat dalam jadual indeks Lucene.

3. Gunakan Lucene untuk melaksanakan carian teks penuh

  1. Memperkenalkan kebergantungan Lucene

Maven ialah alat pengurusan pergantungan yang biasa digunakan dalam pembangunan Java. Kami hanya perlu menambah kebergantungan Lucene berikut dalam Maven:

<dependency>
  <groupId>org.apache.lucene</groupId>
  <artifactId>lucene-core</artifactId>
  <version>8.8.2</version>
</dependency>
Salin selepas log masuk
  1. Buat indeks

Gunakan IndexWriter untuk menukar data kepada jadual indeks. Di sini kami menganggap bahawa data yang dicari datang daripada pangkalan data atau sumber lain. Kita perlu menukarnya kepada bentuk teks dan menambahnya pada IndexWriter. Berikut ialah contoh artikel:

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;

public class Indexer {

    private IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new SmartChineseAnalyzer());
    private IndexWriter indexWriter;

    public Indexer(String indexPath) {
        try {
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            indexWriter = new IndexWriter(directory, indexWriterConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void add(String field, String value) {
        try {
            Document doc = new Document();
            FieldType fieldType = new FieldType();
            fieldType.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
            fieldType.setStored(true);
            fieldType.setTokenized(true);
            doc.add(new Field(field, value, fieldType));
            indexWriter.addDocument(doc);
            indexWriter.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void delete(String field, String value) {
        try {
            indexWriter.deleteDocuments(new Term(field, value));
            indexWriter.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
Salin selepas log masuk

Dalam kelas ini:

  • Dalam pembina Indexer, kami memulakan IndexWriter dan Direktori. Direktori mewakili lokasi perpustakaan indeks. Kaedah
  • add() digunakan untuk menambah data teks pada pustaka indeks. Kaedah
  • delete() digunakan untuk memadam data teks daripada pustaka indeks.
  • kaedah close() digunakan untuk menutup IndexWriter.
  1. Cari

Gunakan Pertanyaan dan IndexReader untuk operasi carian. Berikut ialah contoh kod:

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class Searcher {

    private String[] fields = new String[] {"title", "content"};
    private Query query;
    private IndexReader indexReader;
    private IndexSearcher indexSearcher;

    public Searcher(String indexPath) {
        try {
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            indexReader = DirectoryReader.open(directory);
            indexSearcher = new IndexSearcher(indexReader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Query getQuery(String keyword) {
        try {
            if (query == null) {
                query = new MultiFieldQueryParser(fields, new SmartChineseAnalyzer()).parse(keyword);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return query;
    }

    public List<String> search(String keyword) {
        List<String> result = new ArrayList<String>();
        try {
            TopDocs topDocs = indexSearcher.search(getQuery(keyword), 10);
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                result.add(indexSearcher.doc(scoreDoc.doc).get("title"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public void close() {
        try {
            indexReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
Salin selepas log masuk

Dalam kelas ini:

  • Dalam pembina Searcher, kami memulakan IndexReader dan IndexSearcher.
  • Kaedah getQuery() digunakan untuk menukar keadaan carian yang dimasukkan oleh pengguna kepada jenis Pertanyaan.
  • Kaedah carian() digunakan untuk mencari dan mengembalikan keputusan selepas melakukan operasi carian.
  • kaedah close() digunakan untuk menutup IndexReader.

4. Ringkasan

Artikel ini memperkenalkan cara melaksanakan fungsi carian teks penuh melalui Apache Lucene, terutamanya melibatkan komponen teras Lucene, penggunaan Lucene dan kaedah untuk beberapa kelas biasa di Lucene. Selain kelas dan kaedah yang diliputi dalam artikel ini, terdapat banyak fungsi lain dalam Lucene yang boleh dilaraskan dengan sewajarnya dan digunakan mengikut keperluan yang berbeza. Apache Lucene ialah perpustakaan enjin carian teks penuh yang boleh dipercayai dalam bahasa Java, sesuai untuk banyak bidang. Melalui pembelajaran dan amalan, saya percaya bahawa semua orang boleh menggunakan Apache Lucene dengan lebih baik dalam aplikasi praktikal untuk mencapai fungsi carian yang cekap, tepat dan pantas.

Atas ialah kandungan terperinci Menggunakan Apache Lucene untuk pemprosesan carian teks penuh dalam pembangunan API Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan