Beberapa waktu yang lalu, saya berencana untuk membangun layanan pencarian sederhana untuk proyek tersebut. Meskipun database bisnis MongoDB menyediakan dukungan pencarian teks, ketika sejumlah besar dokumen perlu diposisikan melalui kata kunci, ES jelas lebih cocok sebagai mesin pencari (meskipun kebanyakan dari kita telah menggunakan analisis dan fitur visualisasi Rusa sebelumnya). Elasticsearch dibangun di atas Lucene dan mendukung kueri yang sangat cepat dan sintaks kueri yang kaya, dan kadang -kadang berfungsi sebagai NoSQL yang ringan. Namun, kemampuan untuk operasi kueri dan agregasi yang kompleks tidak terlalu kuat.
Artikel ini tidak akan menyebutkan cara membangun layanan pencarian sederhana, tetapi akan merekam beberapa jebakan yang ditemui selama jam kerja sekitar satu minggu. .
Mengapa Memilih Elasticsearch 5.x?
Layanan baru tidak memiliki beban historis, dan secara teori itu harus menggunakan 6.x. Namun, Spring-Data-Elasticsearch hanya mendukung 5.x, dan sulit untuk secara langsung merangkum lapisan API bahkan jika waktunya kencang. Ini juga karena versi sebelumnya dari barang Elk bingung, jadi tidak punya pilihan selain beralih dari 2.x ke 5.x. Permintaan perbedaan antara 5.x dan 2.x. Sederhananya, itu adalah ruang disk -50%, waktu indeks -50%, kinerja kueri +25%.
Karena Spring-Data-Elasticsearch harus ditingkatkan ke 3.0.7, Spring harus ditingkatkan ke 2.x, yang secara langsung mengarah ke jebakan yang diserang kemudian.
Instalasi Docker ES akan menginstal plugin X-Path secara default
Meskipun Data Spring mendukung ES5.X, fungsinya tidak terlalu lengkap. Oleh karena itu, jika plug-in X-Path diinstal, org.elasticsearch.Client: X-Pack-Transport: 5.5.0 perlu diperkenalkan. Versi harus sama dengan versi ES, dan Anda dapat menerapkan sendiri TransportClient, sebagai berikut
@ComponentPublic Class Esconfig {@Bean Public TransportClient TransportClient () melempar UnknownHostException {TransportClient Client = baru prebuiltXpackTransportClient (settings.builder () .put ("cluster.name", "Docker-cluster") .put ("xpack.security. .addtransportAddress (inetsocketTransportAddress baru (inetaddress.getbyname ("0.0.0.0"), 9300)); klien kembali; }}Ini juga merupakan solusi yang lebih cepat yang dipilih karena saya tidak ingin pergi ke Docker untuk berurusan dengan plug-in X-Path. Jika tidak perlu, saya tidak perlu menyentuh beberapa hal dalam ES sendiri untuk saat ini.
MQ akan menyimpan informasi kelas pesan, menyebabkan deserialized gagal
Rabbitmq dalam judul tidak pernah disebutkan, karena hanya digunakan sebagai antrian pesan. Ketika data berubah, ID pesan dilemparkan ke dalam MQ dan konsumen pada layanan pencarian dikonsumsi.
Masalahnya adalah bahwa ketika pesan dilemparkan ke dalam MQ, itu dienkapsulasi ke dalam objeknya sendiri, yang menyebabkan rabbittemplate.ereceiveand conConvert menjadi gagal karena pesan akan membawa informasi paket objek. Dalam keputusasaan, konsumen hanya dapat secara langsung mendapatkan byte pesan dalam antrian, dan mengubah formulir JSON menjadi objek menggunakan metode ObjectMapper.readValue.
Konfigurasi Gradle dapat menggunakan -dloader.main untuk menentukan fungsi startup
Justru karena MQ diperkenalkan bahwa layanan pencarian perlu memulai konsumen. Metode ini adalah mengimplementasikan aplikasi yang tidak memulai layanan web, dan mengkonfigurasi SimpleMessAgeListenerContainer dan MessageListenerAdapter sebagai berikut:
@Bean SimpleMessAgelistenerContainer Container (ConnectionFactory ConnectionFactory, MessageListenerAdapter listenerAdapter, MQConfig Properties) {SimpleMessAgelistenerContainer container = SimpleMessAgelistenererer (); container.setConnectionFactory (ConnectionFactory); container.setqueueNames (properties.getqueueName ()); container.setMessageListener (listenerAdapter); wadah kembali; } @Bean MessageListenerAdapter listenerAdapter () {MessageListenerAdapter listenerAdapter = New MessageListenerAdapter (itemConsumer, "consume"); Return listenerAdapter; } Masalahnya adalah ketika konfigurasi lulusan, saya mencari waktu yang lama untuk membuat paket JAR yang dibangun dengan yang ditentukan -dloader.main untuk menentukan aplikasi startup. Solusinya adalah sebagai berikut:
Tambahkan file xxx.gradle
bootjar {manifest {atribut 'kelas utama': 'org.springframework.boot.loader.propertieslauncher'}}Dalam proyek Springboot 1.5.9, Anda perlu menentukan aplikasi startup dan perlu menambahkannya
Springboot {tata letak = "zip"}Cara untuk memeriksa apakah efektif adalah dengan secara langsung membuka ritsleting paket JAR setelah membangun dan memeriksanya di xxx (nama proyek) /meta-info/manifest.mf.
Kelas Utama: org.springframework.boot.loader.propertieslauncher
Kemudian perbaiki, jika
Kelas Utama: org.springframework.boot.loader.jarlauncher
Kelas mulai dalam file masih akan dimulai
ES tidak dapat memodifikasi pemetaan indeks
Karena hanya menggunakan fungsi pencarian teks ES, ada banyak hasil pencarian yang tidak memuaskan dalam aplikasi yang sebenarnya, seperti mencari "meja", dan tidak mungkin untuk mencari konten seperti "meja komputer/meja kantor" dan tabel xx lainnya. Ada banyak kasus dengan cara ini. Oleh karena itu, Kamus Sinonim Ditambahkan, dan Segmenter Kata IK_Smart tidak digunakan pada bidang yang membutuhkan segmentasi kata, sehingga pemetaan beberapa bidang perlu diubah untuk
// Analyzer adalah nama Segmenter kata sendiri @Field (type = fieldType.text, index = true, analyzer = "synconim") private string description;
Karena pemetaan ES tidak dapat dimodifikasi, Anda hanya dapat secara manual membuat pemetaan baru, dan kemudian menggunakan metode reindex untuk mengisi ulang data (ES5.X hadir dengan REIDEX API). Ada metode online melalui alias. Dalam beberapa skenario modifikasi, Anda dapat dengan lancar memodifikasi pemetaan tanpa memulai kembali/menggunakan aplikasi. Anda dapat meminta dan memahami detailnya.
Di atas adalah jebakan yang telah disentuh oleh layanan pencarian. Beberapa dari mereka telah menghabiskan banyak waktu dan energi untuk dipecahkan. Saya berharap ini akan menjadi nilai referensi untuk daftar ini. Di masa depan, akan ada beberapa optimasi di layanan pencarian dan akan terus diperbarui secara perlahan. Saya juga berharap semua orang akan lebih mendukung wulin.com.