Elasticsearch'ü bir makalede anlayın | Kuvvet Projesi

Yazar | mr_xinchen

Kaynak | CSDN Blogu

Üretildi | CSDN (ID: CSDNnews)

Elasticsearch'e Giriş

Elasticsearch, Lucene tabanlı dağıtılmış bir tam metin arama sunucusudur. Baidu Library tarafından verilen açıklamaya bakalım.

kullanım : Arama işlevi yap Kullanım Durumları : GitHub, Wikipedia vb. Solr karşılaştırması:

  • Gerçek zamanlı ES, Solr'den daha yüksektir

  • Solr geleneksel arama performansı ES'den daha yüksektir

Elasticsearch kurulumu

Not: Kurulum, java1.8'in üzerinde bir Windows ortamında olmalıdır.

  • Sıkıştırılmış bir paketi indirmek ve almak için resmi web sitesine gidin, sürüm 6.2.4

  • Zip dosyasını açın ve bin klasörünü bulmak için dizini girin

  • Elasticsearch.bat komut dosyasını bin klasöründe çalıştırmak için çift tıklayın

  • Tarayıcıya http: // localhost: 9200 / girin

  • Tarayıcı, kurulumun başarılı olduğunu gösteriyor

    Linux ortamı

    1. Kurulum ve yapılandırma

    Elasticsearch'ü linux altında 6.2.4 sürümünü kullanarak kuracağız.

    2. Yeni bir kullanıcı oluşturun

    Güvenlik nedenleriyle, elasticsearch'ün varsayılan olarak root olarak çalışmasına izin verilmez.

    Kullanıcı oluştur:

    1kullanıcıadd kullanıcı adı

    şifreyi belirle:

    1passwd kullanıcı adı

    Kullanıcı değiştir:

    1su kullanıcı adı

    3. Kurulum paketini yükleyin ve sıkıştırmayı açın

    Kurulum paketini / home / username dizinine yüklüyoruz

    unzip:

    1tar -zxvf elasticsearch-6.2.4.tar.gz

    Dizini yeniden adlandırıyoruz:

    1mv elasticsearch-6.2.4 / elasticsearch

    Dizin yapısını girin ve görüntüleyin:

    1ls -l / ev / kullanıcı adı / elasticsearch

    4. Yapılandırmayı değiştirin

    Config dizinine giriyoruz: cd config

    Değiştirilmesi gereken iki yapılandırma dosyası vardır:

    jvm.options

    Elasticsearch, Lucene'ye dayanmaktadır ve Lucene'nin alt katmanı Java'da uygulanmaktadır, bu nedenle jvm parametrelerini yapılandırmamız gerekir.

    Jvm.options'ı düzenleyin:

    1vim jvm.options

    Varsayılan yapılandırma aşağıdaki gibidir:

    1-Xms1g 2-Xmx1g

    Hafıza çok fazla kaplıyor, hadi azaltalım:

    1-Xms512m 2-Xmx512m

    elasticsearch.yml

    1vim elasticsearch.yml

    • Verileri ve günlük dizinini değiştirin:

    1path.data: / home / kullanıcıadı / elasticsearch / data # veri dizini konumu 2path.logs: / home / username / elasticsearch / logs # günlük dizin konumu

    Veri ve günlük dizinlerini elasticsearch kurulum dizinine işaret edecek şekilde değiştirdik. Ancak bu iki dizin mevcut değil, bu yüzden onları oluşturmamız gerekiyor.

    Elasticsearch'ün kök dizinine gidin ve oluşturun:

    1mkdir verileri 2mkdir günlükleri
    • Bağlı ip'i değiştirin:

    1network.host: 0.0.0.0 # 0.0.0.0'a bağlayarak tüm iplerin erişmesine izin verir

    Varsayılan olarak, yalnızca yerel erişime izin verilir, 0.0.0.0'a değiştirildikten sonra uzaktan erişim mümkündür

    Şu anda bağımsız bir kurulum yapıyoruz.Bir küme yapmak istiyorsanız, yalnızca bu yapılandırma dosyasına diğer düğüm bilgilerini eklemeniz gerekir.

    Elasticsearch.yml'nin diğer yapılandırılabilir bilgileri:

    5. Çalıştır

    Elasticsearch / bin dizinine girin, aşağıdaki çalıştırılabilir dosyaları görebilirsiniz:

    Ardından komutu girin:

    1./elasticsearch

    Bir hata bulundu, başlatılamadı:

    • Hata 1: Çekirdek çok düşük

    Biz centos6 kullanıyoruz ve linux kernel versiyonu 2.6. Elasticsearch eklentisi en az sürüm 3.5 gerektirir. Ama önemli değil, bu eklentiyi devre dışı bırakabiliriz.

    Elasticsearch.yml dosyasını değiştirin ve aşağıdaki yapılandırmayı en alta ekleyin:

    1bootstrap.system_call_filter: yanlış

    Sonra yeniden başlat

    • Hata 2: Yetersiz dosya izinleri

    Tekrar başladı, başka bir hata oluştu:

    1: elasticsearch süreci için maksimum dosya tanımlayıcıları muhtemelen çok düşük, en azından artırın

    Kök yerine normal bir kullanıcı kullanıyoruz, bu nedenle dosya izinleri yetersiz.

    Önce kök kullanıcı olarak oturum açın.

    Ardından yapılandırma dosyasını değiştirin:

    1vim /etc/security/limits.conf

    Aşağıdaki içeriği ekleyin:

    1 * yumuşak nofile 655362 3 * sert nofile 1310724 5 * yumuşak nproc 40966 7 * sert nproc 4096
    • Hata 3: Yeterli konu yok

    Hata raporunda başka bir satır var:

    1: kullanıcı için maksimum iş parçacığı sayısı çok düşük, en azından artırın

    Bunun nedeni, iş parçacığı sayısının yeterli olmamasıdır.

    Yapılandırmayı değiştirmeye devam edin:

    1vim /etc/security/limits.d/90-nproc.conf

    Aşağıdaki içeriği değiştirin:

    1 * yumuşak nproc 1024

    Kime:

    1 * yumuşak nproc 4096

    • Hata 4: Sanal belleği işleyin

    1: maksimum sanal bellek alanı vm.max_map_count muhtemelen çok düşük, en azından artırın

    vm.max_map_count: Bir işlemin sahip olabileceği VMA (sanal bellek alanı) sayısını sınırlayın, yapılandırma dosyasını değiştirmeye devam edin ,:

    1vim /etc/sysctl.conf

    Aşağıdaki içeriği ekleyin:

    1vm.max_map_count = 655360

    Ardından şu komutu yürütün:

    1sysctl -p

    6. Terminal penceresini yeniden başlatın

    Tüm hatalar düzeltildikten sonra, Xshell terminalinizi yeniden başlatmalısınız, aksi takdirde yapılandırma geçersiz olacaktır.

    7. Başla

    Elasticsearch / bin dizinine gidin ve şu komutu girin:

    1./elasticsearch

    İki bağlantı noktasının bağlı olduğunu görebilirsiniz:

    • 9300: Küme düğümleri arasındaki iletişim arabirimi

    • 9200: İstemci erişim arayüzü

    Tarayıcıda ziyaret ediyoruz:

    Elasticsearch teorik bilgisi

    Son Lucene makalemi okuduktan sonra, herkes Lucene'yi geleneksel veri tabanlarıyla karşılaştırdığımı biliyor. Aslında, pek çok benzerlikleri var.Şimdi Elasticsearch'ü Mysql ile karşılaştıralım.

    1Mysql- > veri tabanı- > masa- > satırlar- > sütunlar 23Elastikarama- > indeks- > tip- > belgeler- > alanlar

    1. dizin

    Bir veritabanına benzer olabilir, ancak fark, biraz benzer özelliklere sahip bir belge koleksiyonudur.Örneğin, bir ürün veri dizini veya müşteri veri dizinine sahip olabilirsiniz.

    2. tür

    Benzer şekilde, belgeleri sınıflandırmak için kullanılan bir tablo olarak kabul edilebilir.Genellikle, bir dizi ortak alana sahip belgeler için bir tür tanımlanır.

    3. belgeler

    Benzer şekilde bir tablodaki sonraki veri satırı olarak kabul edilebilir.Bir belge, indekslenebilen temel bir bilgi birimidir.

    4. alanlar (lucene'de alan adı verilen alanlar)

    Belge verilerini farklı özniteliklere göre sınıflandırmak ve tanımlamak için benzer şekilde bir tablo alanı olarak kabul edilebilir.

    5. haritalama

    Benzer şekilde alanın veri türü ve kısıtlamaları olarak da kabul edilebilir. Haritalama, bir alanın veri türü, varsayılan değer, analizör, dizine eklenip eklenmeyeceği gibi verilerin işlenme şekli ve kuralları üzerinde bazı kısıtlamalar getirmektir.

    6. parça kopyaları (parça yedeklemesi)

    ES, belge verilerini parçalara ayıran ve birden çok parçayı birlikte eksiksiz bir veri oluşturan, dağıtılmış, büyük veri hacimli bir tam metin arama sunucusudur. Dağıtılmış bir ortamda, tek bir hata noktasının ortaya çıkması çok muhtemeldir. Şu anda, yedeklenmesi gereken her bir bölüm eşzamanlı olarak kopyalanacak ve aktarılacaktır.

    RESTfull sözdizimi

    Burada kibana kullanıyorum veya başka araçlar da kullanabilirsiniz

    1. Dizin ve eşleme oluşturun

    1PUT / dizin adı 23 { 45 "eşleme": { 67 "tür adı": { 89 "özellik": { 1011 "alan adı": { 1213 "type": "Tür", 1415 "mağaza": saklanıp saklanmayacağı, 1617 "indeks": indekslenip indekslenmeyeceği 1819 "analizci": "kelime ayırıcı" 20 yirmi bir }, yirmi iki 23 "alan adı": { yirmi dört 25 "type": "metin", 2627 "mağaza": doğru, 2829 "dizin": doğru, 3031 "analizör": "standart" 3233} 3435} 3637} 3839} 4041}

    2. Dizini oluşturduktan sonra eşleme ekleyin

    1POST / dizin adı / tür adı / _mapping 23 { 45 "tür adı": { 67 "özellik": { 89 "alan adı": { 1011 "type": "long", 1213 "mağaza": doğru, 1415 "indeks": yanlış 1617}, 1819 "alan adı": { 2021 "type": "metin", yirmi iki 23 "mağaza": doğru, yirmi dört 25 "dizin": doğru, 2627 "analizör": "standart" 2829} 3031} 3233} 3435}

    3. Dizin dizinini silin

    1DELETE / dizin adı

    4. Belge belgesi ekleyin

    1POST / dizin adı / tür adı / 23 { 45 "FIELD": "VALUE", 67 "FIELD": "VALUE", 89 "FIELD": "VALUE" 1011}

    5. Belgeyi değiştir

    1, eklemeyle aynıdır ve _id var

    6. Belge belgesini silin

    1DELETE / dizin adı / tür adı / _id

    7. _id ile sorgu

    1GET / dizin adı / tür adı / _id

    8. Terime göre sorgulama

    1POST / dizin adı / tür adı / _search 23 { 45 "sorgu": { 67 "terim": { 89 "FIELD": "VALUE" 1011} 1213} 1415}

    9. query_string'e göre sorgulama

    1POST / dizin adı / tür adı / _search 23 { 45 "sorgu": { 67 "sorgu_dizesi": { 89 "default_field": "FIELD", 1011 "sorgu": "bu VE bu VEYA böyle" 1213} 1415} 1617}

    IK belirteç

    Kelime segmentasyon etkisini görüntüleyin

    1GET / _analyze 23 { 45 "analizör": "standart", 67 "metin": "VALUE" 89}

    Entegre IK belirteç oluşturucu

  • Sıkıştırılmış IK tokenizer paketini indirin ve açın

  • Elasticsearch klasörünü ik-analyzer olarak yeniden adlandırın

  • İk-analyzer klasörünü elasticsearch dizininin eklentiler klasörüne yerleştirin

  • Elasticsearch sunucusunu yeniden başlatın

  • Kelime segmenterinin etkisini test etmek için analizörün değerini ik_smart veya ik_max_word olarak değiştirin

  • Elasticsearch kümesi

    Buradaki ES kümesi oldukça basit, Solr gibi bir kayda ihtiyaç duymuyor. Aslında, herkes bilir ki, dağıtılmış çocuk ayakkabılarını oynadıktan sonra, küme oynamak, birkaç örnek daha açıp bunları bir veya daha fazla kayıtla yönetmekten başka bir şey değildir. ES küme modu, basitçe bir yayın dağıtılmış sistem olan P2P tipi (dedikodu protokolü kullanan) dağıtılmış bir sistem kullanır. Dolayısıyla yapılandırma, teslim alma kayıt defterinden daha basittir.

    1. küme

    Bir küme, tüm verileri bir arada tutan ve dizin ve arama işlevlerini bir arada sağlayan bir veya daha fazla düğüm tarafından organize edilir. Bir küme, varsayılan olarak "elasticsearch" olan benzersiz bir adla tanımlanır. Bu ad önemlidir çünkü bir düğüm bu kümeye yalnızca belirli bir kümenin adını belirterek katılabilir.

    2. düğüm (düğüm)

    Kümelenmiş bir sunucudur

    3. parça kopyaları (parça yedeklemesi)

    Birden çok ES sunucusu hazırlayın ve elasticsearch-cluster \ config \ elasticsearch.yml yapılandırma dosyasını değiştirin

    1 # Düğümün yapılandırma bilgileri: 23 # Küme adı, benzersiz olması garantili 45cluster.name: elasticsearch 67 # Düğüm adı, farklı olmalıdır 89node.name: düğüm-11011 # Bu makinenin ip adresi olmalı 1213network.host: 127.0.0.11415 # Servis bağlantı noktası numarası, aynı makinede farklı olmalıdır 1617http.port: 92001819 # Kümeler arası iletişim bağlantı noktası numarası, aynı makinede farklı olmalıdır 2021transport.tcp.port: 9300 yirmi iki 23 # Kümeyi, makine IP koleksiyonunu otomatik olarak bulacak şekilde ayarlayın yirmi dört 25discovery.zen.ping.unicast.hosts:

    JAVA istemcisi

    7.1 Maven projesi oluşturun ve koordinatları içe aktarın

    1 < bağımlılıklar > 23 < bağımlılık > 45 < Grup kimliği > org.elasticsearch < /Grup kimliği > 67 < artifactId > elasticsearch < / artifactId > 89 < versiyon > 5.6.10 < / version > 1011 < /bağımlılık > 1213 < bağımlılık > 1415 < Grup kimliği > org.elasticsearch.client < /Grup kimliği > 1617 < artifactId > Ulaşım < / artifactId > 1819 < versiyon > 5.6.10 < / version > 20 yirmi bir < /bağımlılık > yirmi iki yirmi üç < bağımlılık > yirmi dört 25 < Grup kimliği > org.apache.logging.log4j < /Grup kimliği > 2627 < artifactId > log4j-slf4j arası < / artifactId > 2829 < versiyon > 2.9.1 < / version > 3031 < /bağımlılık > 3233 < bağımlılık > 3435 < Grup kimliği > org.slf4j < /Grup kimliği > 3637 < artifactId > slf4j-api < / artifactId > 3839 < versiyon > 1.7.24 < / version > 4041 < /bağımlılık > 4243 < bağımlılık > 4445 < Grup kimliği > org.slf4j < /Grup kimliği > 4647 < artifactId > slf4j-basit < / artifactId > 4849 < versiyon > 1.7.21 < / version > 5051 < /bağımlılık > 5253 < bağımlılık > 5455 < Grup kimliği > log4j < /Grup kimliği > 5657 < artifactId > log4j < / artifactId > 5859 < versiyon > 1.2.12 < / version > 6061 < /bağımlılık > 6263 < bağımlılık > 6465 < Grup kimliği > Junit < /Grup kimliği > 6667 < artifactId > Junit < / artifactId > 6869 < versiyon > 4.12 < / version > 7071 < /bağımlılık > 7273 < / bağımlılıklar >

    7.2 Bir dizin kitaplığı oluşturun

    1public class ElasticsearchClient { 23 @Test 45 public void createIndex Exception { 67 // Bir ayarlar nesnesi oluşturun 89 Ayarlar ayarları = Settings.builder 1011.put ("küme.adı", "elasticsearch") 1213. yapı; 1415 // İstemci nesnesi oluştur 1617 TransportClient istemcisi = new PreBuiltTransportClient (ayarlar); 1819 client.addTransportAddress (yeni InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)); 2021 // İndeks kitaplığı oluştur yirmi iki 23 client.admin.indices.prepareCreate ("index_hello"). Get; yirmi dört 25 // Kaynakları kapatın 2627 müşteri.close; 2829} 3031}

    7.3 Eşleştirmeyi ayarlama

    1public class ElasticsearchClient { 23 @Test 45 public void setMapping istisna {{ 67 // Bir ayarlar nesnesi oluşturun 89 Ayarlar ayarları = Settings.builder 1011.put ("küme.adı", "elasticsearch") 1213. yapı; 1415 // İstemci nesnesi oluştur 1617 TransportClient istemcisi = new PreBuiltTransportClient (ayarlar); 1819 client.addTransportAddress (yeni InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)); 2021 // Eşleme Derleme, RESTfull istek gövdesi yirmi iki 23 XContentBuilder oluşturucu = XContentFactory.jsonBuilder yirmi dört 25 .startObject 2627 .startObject ("makale") 2829 .startObject ("özellikler") 3031 .startObject ("id") 3233 .field ("tür", "uzun") 3435 .field ("mağaza", doğru) 3637 .endObject 3839 .startObject ("başlık") 4041 .field ("tür", "metin") 4243 .field ("mağaza", doğru) 4445 .field ("analizör", "ik_smart") 4647 .endObject 4849 .startObject ("içerik") 5051 .field ("tür", "metin") 5253 .field ("mağaza", doğru) 5455 .field ("analizör", "ik_smart") 5657 .endObject 5859. EndObject 6061. EndObject 6263 .endObject; 6465 // Eşlemeyi dizin kitaplığına ayarlamak için istemciyi kullanın 6667 client.admin.indices 6869 .preparePutMapping ("index_hello") 7071 .setType ("makale") 7273 .setSource (oluşturucu) 7475 .get; 7677 // Kaynakları kapat 7879 müşteri.close; 8081} 8283}

    7.4 Belge ekle

    1public class ElasticsearchClient { 23 @Test 45 genel void addDocument İstisna { 67 // Bir ayarlar nesnesi oluşturun 89 Ayarlar ayarları = Settings.builder 1011.put ("küme.adı", "elasticsearch") 1213. yapı; 1415 // İstemci nesnesi oluştur 1617 TransportClient istemcisi = new PreBuiltTransportClient (ayarlar); 1819 client.addTransportAddress (yeni InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)); 2021 XContentBuilder oluşturucu = XContentFactory.jsonBuilder yirmi iki 23 .startObject yirmi dört 25 .field ("id", 1L) 2627 .field ("başlık", "Ticaret Bakanlığı: İş ve ticaret girişimlerini işe ve üretime devam ettirmek için düzenli ve zorla organize edin") 2829 .field ("içerik", "Xinhua Haber Ajansı, Pekin, 23 Şubat (Muhabirler Chen Weiwei, Wang Yuxiao) Muhabirler 23'ünde Ticaret Bakanlığından" Günlük İhtiyaçların Arzı ve Garantisi Koordinasyon Bildirimi "yayınladığını öğrendiler. ", yerel ticari makamların, salgının önlenmesi ve kontrolünün güvenliğini sağlama öncülü altında ticari ve ticari işletmelerin işlerine yeniden başlamasını ve üretimini düzenli ve etkili bir şekilde organize etmesini zorunlu kılmak.") 3031 .endObject; 3233 // Sunucuya gönder 3435 client.prepareIndex ("index_hello", "makale", "1") 3637 .setSource (oluşturucu) 3839 .get; 4041 // Kaynakları kapatın 4243 müşteri.close; 44454647} 4849}

    7.5 Sorgu (temel işlev)

    • _Id ile sorgu

    • Terime göre sorgulama

    • QueryString'e göre

    • Sayfalamayı ayarlama (sorguyu yürütmeden önce SearchResponse'da setFrom ve setSize yöntemleri)

    • Vurguyu ayarla

    1public class SearchIndex { 23 özel TransportClient istemcisi; 45 @Önce 67 public void initthrows Exception { 89 // Bir ayarlar nesnesi oluşturun 1011 Ayarlar ayarları = Settings.builder 1213.put ("küme.adı", "elasticsearch") 1415. yapı; 1617 // İstemci nesnesi oluştur 1819 müşteri = yeni PreBuiltTransportClient (ayarlar); 2021 client.addTransportAddress (yeni InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)); yirmi iki yirmi üç } yirmi dört 25 @Test 2627 public void searchById { 2829 // Sorgu nesnesi oluştur 3031 QueryBuilder queryBuilder = QueryBuilders.idsQuery.addIds ("1", "2"); 3233 // sorguyu yürüt 3435 SearchResponse searchResponse = client.prepareSearch ("index_hello") 3637 .setTypes ("makale") 3839 .setQuery (queryBuilder) 4041. Get; 4243 // Toplam kayıt sayısını alın 4445 SearchHits hits = searchResponse.getHits; 4647 System.out.println ("Toplam kayıtlar:" + hits.getTotalHits); 4849 // Sonuç listesi 5051 Yineleyici < SearchHit > iterator = hits.iterator; 5253 süre (iterator.hasNext) { 5455 SearchHit next = iterator.next; 5657 Harita < Dize, Nesne > source = next.getSource; 5859 System.out.println ("id:" + source.get ("id")); 6061 System.out.println ("title:" + source.get ("title")); 6263 System.out.println ("içerik:" + kaynak.get ("içerik")); 6465 System.out.println ("----------------------------------"); 6667} 68697071} 7273 @Test 7475 genel void searchByTerm { 7677 // Sorgu nesnesi oluştur 7879 QueryBuilder queryBuilder = QueryBuilders.termQuery ("title", "Resume"); 8081 // sorguyu yürüt 8283 SearchResponse searchResponse = client.prepareSearch ("index_hello") 8485 .setTypes ("makale") 8687.setQuery (queryBuilder) 8889 .get; 9091 // Toplam kayıt sayısını alın 9293 SearchHits hits = searchResponse.getHits; 9495 System.out.println ("Toplam kayıt:" + hits.getTotalHits); 9697 // Sonuç listesi 9899 Yineleyici < SearchHit > iterator = hits.iterator; 100101 while (iterator.hasNext) { 102103 SearchHit next = iterator.next; 104105 Harita < Dize, Nesne > source = next.getSource; 106107 System.out.println ("id:" + source.get ("id")); 108109 System.out.println ("title:" + source.get ("title")); 110111 System.out.println ("content:" + source.get ("içerik")); 112113 System.out.println ("----------------------------------"); 114115} 116117118119} 120121 @Test 122123 public void searchByQueryString { 124125 // Sorgu nesnesi oluştur 126127 QueryBuilder queryBuilder = QueryBuilders.queryStringQuery ("Ailem Lin'an'da yaşıyor"). DefaultField ("title"); 128129 // sorguyu yürüt 130131 SearchResponse searchResponse = client.prepareSearch ("index_hello") 132133 .setTypes ("makale") 134135 .setQuery (queryBuilder) 136137. SetFrom (0) 138139. SetSize (3) 140141 .highlighter (yeni HighlightBuilder.field ("title"). PreTags (" < em > ") .postTags (" < / em > ")) 142143 .get; 144145 // Toplam kayıt sayısını al 146147 SearchHits hits = searchResponse.getHits; 148149 System.out.println ("Toplam kayıtlar:" + hits.getTotalHits); 150151 // Sonuç listesi 152153 Yineleyici < SearchHit > iterator = hits.iterator; 154155 süre (iterator.hasNext) { 156157 SearchHit next = iterator.next; 158159 Harita < Dize, Nesne > source = next.getSource; 160161 System.out.println ("id:" + source.get ("id")); 162163 System.out.println ("title:" + source.get ("title")); 164165 System.out.println ("içerik:" + kaynak.get ("içerik")); 166167 System.out.println ("----------------------------------"); 168169 HighlightField title = next.getHighlightFields.get ("title"); 170171 System.out.println (title.getFragments); 172173} 174175176177} 178179 @Sonra 180181 public void close { 182183 client.close; 184185} 186187}

    Bahar Verileri Elasticsearch

    ES'yi çalıştırmak için orijinal JAVA istemcisini kullanmak çok karmaşıktır ve Spring, ES'nin çalışmasını entegre etmede en iyisidir, bu nedenle Spring Data'yı kullanmanız önerilir ve orijinali anlamak için yeterlidir.

    8.1 Bir Maven projesi oluşturun ve koordinatları içe aktarın

    1 < bağımlılıklar > 23 < bağımlılık > 45 < Grup kimliği > org.elasticsearch < /Grup kimliği > 67 < artifactId > elasticsearch < / artifactId > 89 < versiyon > 5.6.10 < / version > 1011 < /bağımlılık > 1213 < bağımlılık > 1415 < Grup kimliği > org.elasticsearch.client < /Grup kimliği > 1617 < artifactId > Ulaşım < / artifactId > 1819 < versiyon > 5.6.10 < / version > 20 yirmi bir < /bağımlılık > yirmi iki yirmi üç < bağımlılık > yirmi dört 25 < Grup kimliği > org.apache.logging.log4j < /Grup kimliği > 2627 < artifactId > log4j-slf4j arası < / artifactId > 2829 < versiyon > 2.9.1 < / version > 3031 < /bağımlılık > 3233 < bağımlılık > 3435 < Grup kimliği > org.slf4j < /Grup kimliği > 3637 < artifactId > slf4j-api < / artifactId > 3839 < versiyon > 1.7.24 < / version > 4041 < /bağımlılık > 4243 < bağımlılık > 4445 < Grup kimliği > org.slf4j < /Grup kimliği > 4647 < artifactId > slf4j-basit < / artifactId > 4849 < versiyon > 1.7.21 < / version > 5051 < /bağımlılık > 5253 < bağımlılık > 5455 < Grup kimliği > log4j < /Grup kimliği > 5657 < artifactId > log4j < / artifactId > 5859 < versiyon > 1.2.12 < / version > 6061 < /bağımlılık > 6263 < bağımlılık > 6465 < Grup kimliği > Junit < /Grup kimliği > 6667 < artifactId > Junit < / artifactId > 6869 < versiyon > 4.12 < / version > 7071 < /bağımlılık > 7273 < bağımlılık > 7475 < Grup kimliği > com.fasterxml.jackson.core < /Grup kimliği > 7677 < artifactId > Jackson çekirdekli < / artifactId > 7879 < versiyon > 2.8.1 < / version > 8081 < /bağımlılık > 8283 < bağımlılık > 8485 < Grup kimliği > com.fasterxml.jackson.core < /Grup kimliği > 8687 < artifactId > jackson-databind < / artifactId > 8889 < versiyon > 2.8.1 < / version > 9091 < /bağımlılık > 9293 < bağımlılık > 9495 < Grup kimliği > com.fasterxml.jackson.core < /Grup kimliği > 9697 < artifactId > jackson-annotations < / artifactId > 9899 < versiyon > 2.8.1 < / version > 100101 < /bağımlılık > 102103 < bağımlılık > 104105 < Grup kimliği > org.springframework.data < /Grup kimliği > 106107 < artifactId > Spring-data-elasticsearch < / artifactId > 108109 < versiyon > 3.0.9. YAYIN < / version > 110111 < istisnalar > 112113 < dışlama > 114115 < Grup kimliği > org.elasticsearch.plugin < /Grup kimliği > 116117 < artifactId > transport-netty4-client < / artifactId > 118119 < / dışlama > 120121 < / hariç tutmalar > 122123 < /bağımlılık > 124125 < bağımlılık > 126127 < Grup kimliği > org.springframework < /Grup kimliği > 128129 < artifactId > bahar testi < / artifactId > 130131 < versiyon > 5.0.8. YAYIN < / version > 132133 < dürbün > Ölçek < /dürbün > 134135 < /bağımlılık > 136137138139 < / bağımlılıklar >

    8.2 Yapılandırma dosyası ekleyin

    1 < ? xml version = "1.0" encoding = "UTF-8"? > 23 < fasulye xmlns = " 45 xmlns: xsi = " 67 xmlns: context = " 89 xmlns: elasticsearch = " 1011 xsi: schemaLocation = " 1213http: //www.springframework.org/schema/beans 1415http: //www.springframework.org/schema/beans/spring-beans.xsd 1617http: //www.springframework.org/schema/context 1819http: //www.springframework.org/schema/context/spring-context.xsd 2021http: //www.springframework.org/schema/data/elasticsearch yirmi iki 23http: //www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd yirmi dört 25 " > 2627 < ! - İstemci nesnesi - > 2829 < elasticsearch: transport-client id = "esClient" cluster-name = "elasticsearch" cluster-nodes = "127.0.0.1:9300" / > 3031 < ! - Paket Tarayıcı - > 3233 < elasticsearch: repositories base-package = "com.itheima.es.repositories" / > 3435 < ! - Şablon nesnesi - > 3637 < bean id = "elasticsearchTemplate" class = "org.springframework.data.elasticsearch.core.ElasticsearchTemplate" > 3839 < yapıcı-arg adı = "müşteri" ref = "esClient" / > 4041 < /fasulye > 4243 < /Fasulyeler >

    8.3 Varlık sınıfı oluşturun ve dao arayüzü ekleyin

    1 @ Document (indexName = "my_blog", type = "makale") 23public class Article { 45 @ Kimlik 67 @Field (tür = FieldType.Long) 89 özel Long id; 1011 @Field (type = FieldType.Text, analizör = "ik_smart") 1213 özel String başlığı; 1415 @Field (type = FieldType.Text, analizör = "ik_smart") 1617 özel String içeriği; 18192021 genel Makale { yirmi iki yirmi üç } yirmi dört 252627 genel Makale (Uzun id, Dize başlığı, Dize içeriği) { 2829 this.id = id; 3031 this.title = title; 3233 this.content = içerik; 3435} 36373839 public Long getId { 4041 dönüş kimliği; 4243} 44454647 public void setId (Long id) { 4849 this.id = id; 5051} 52535455 public String getTitle { 5657 dönüş başlığı; 5859} 60616263 public void setTitle (Dize başlığı) { 6465 this.title = title; 6667} 68697071 public String getContent { 7273 iade içeriği; 7475} 76777879 public void setContent (Dize içeriği) { 8081 this.content = içerik; 8283} 84858687 @Override 8889 public String toString { 9091 iade "Makale {" + 9293 "id =" + id + 9495 ", başlık = '" + başlık +' \ '' + 9697 ", içerik = '" + içerik +' \ '' + 9899 '}'; 100101} 102103} 1public arayüz ArticleRepository, ElasticsearchRepository'yi genişletir < Makale, Uzun > { 23}

    8.4 İndeks eşleme ve belge ekleme, silme, değiştirme ve sorgulama

    1 @ RunWith (SpringRunner.class) 23 @ ContextConfiguration ("sınıf yolu: applicationContext.xml") 45public class ESTest { 67 @Autowired 89 özel Makale Deposu makale Deposu; 1011 @Autowired 1213 özel ElasticsearchTemplate şablonu; 1415 @Test 1617 public void createIndex { 1819 // Dizin oluştur ve eşlemeyi yapılandır 2021 template.createIndex (Article.class); yirmi iki 23 // Eşlemeyi yapılandırın yirmi dört 25 // template.putMapping (Article.class); 2627} 2829 @Test 3031 public void addDocumentAndUpdateDocument { 3233 Makale makalesi = yeni Makale (2L, "Güncel Olaylar Haberleri Gözü Televizyonda yayınlanan ender bir konferansta, Xi Jinping, ikinci ayın ilk günü olan 23 Şubat" salgın "ile mücadele etmek için bu şekilde seferber oldu. Büyük Halk Salonu düzenlendi ve şubelerdeki mekanlar ilçelere ve alaylara kuruldu. Çin salgın önleme ve kontrol için halk savaşı, genel savaş ve direniş savaşı veriyor. Bu savaş nasıl analiz edilir? Şu anki adım nerede? Şahsen nasıl kazanılır? Savaşı yöneten Xi Jinping, bu "savaş zamanı toplantısında" sakince cevap verdi); 3435 // belge ekle 3637 articleRepository.save (makale); 3839} 4041 @Test 4243 public void delDocument { 4445 // Id'ye göre sil 4647 makaleRepository.deleteById (1L); 4849 // Tümünü sil 5051 // articleRepository.deleteAll; 5253} 5455 @Test 5657 public void findAll { 5859 Tekrarlanabilir < makale > all = articleRepository.findAll; 6061 hepsi. Her biri için (bir- > System.out.println (a)); 6263} 6465 @Test 6667 public void findById { 6869 Opsiyonel < makale > isteğe bağlı = articleRepository.findById (2L); 7071 System.out.println (isteğe bağlı.get); 7273} 7475}

    8.5 Özel sorgu

    Arayüzde özel sorguları tanımlayın, IDEA kullanırken ipuçları olacaktır

    8.6 Orijinal sorgu koşulu sorgusu

    1 @Test 23 public void nativeSearch { 45 NativeSearchQuery sorgu = yeni NativeSearchQueryBuilder 67.withQuery ( 89 QueryBuilders.queryStringQuery ("Sorguyu test et") 1011.defaultField ("başlık") 1213) .withPageable (PageRequest.of (0,15)) 1415. yapı; 1617 Toplu Sayfa < makale > makaleler = şablon.queryForPage (sorgu, Article.class); 1819 makale. Her biri için (a- > System.out.println (a)); 20 yirmi bir }

    Bu noktada ES öğrenmek proje için yeterli oldu, bu yüzden bu teknolojiyi öğrendikten sonra beyninizden kurtulmasına izin vermeyin, acele edin ve projenize uygulayın. Son olarak, teknolojiyi daha çok öğrenmenizi dilerim!

    Ekli alan özellikleri Ayrıntılı alan özellikleri tip

    Elasticsearch'te desteklenen veri türleri çok zengindir:

    Birkaç önemli şey söylüyoruz:

    • İki tür Dize vardır:

      • metin: kelime bölümlere ayrılabilir, toplamaya katılamaz

      • anahtar kelime: ayrılmaz kelimeler, veriler tam bir alan olarak eşleştirilecek ve toplamaya katılabilecek

    • Sayısal: Sayısal tip, iki kategoriye ayrılmıştır

      • Temel veri türleri: long, integer, short, byte, double, float, half_float

      • Yüksek hassasiyetli kayan nokta numarası türü: scaled_float

        • 10 veya 100 gibi bir kesinlik faktörü belirtmeniz gerekir. Elasticsearch, gerçek değeri bu faktörle çarpacak ve depolayacak ve çıkarıldığında geri yükleyecektir.

    • Tarih: tarih türü

    Elasticsearch, tarihi depolama için bir dize olarak biçimlendirebilir, ancak bunu bir milisaniye değeri olarak saklamamız ve yerden tasarruf etmek için uzun bir süre saklamamız önerilir.

    indeks

    Dizin, alanın dizinini etkiler.

    • doğru: Alan dizine eklenir ve arama için kullanılabilir. Varsayılan değer doğrudur

    • false: alan dizine eklenmeyecek ve arama için kullanılamaz

    İndex'in varsayılan değeri true'dur, bu da tüm alanların herhangi bir konfigürasyon olmadan dizine alınacağı anlamına gelir.

    Ancak, ürün resmi bilgileri gibi indekslenmesini istemediğimiz bazı alanlar, indeksi manuel olarak yanlış olarak ayarlamanız gerekir.

    mağaza

    Verilerin ek olarak saklanıp saklanmayacağı.

    Lucene ve Solr öğrenirken, bir alanın deposu yanlış olarak ayarlanmışsa, belge listesinde bu alanın değeri olmayacağını ve kullanıcının arama sonuçlarında görüntülenmeyeceğini biliyoruz.

    Ancak Elasticsearch'te mağaza yanlış değerine ayarlanmış olsa bile sonuçları arayabilirsiniz.

    Bunun nedeni, Elasticsearch'ün bir belge dizini oluşturduğunda, belgedeki orijinal verileri yedeklemesi ve _source adlı bir özniteliğe kaydetmesidir. Ve hangisinin görüntülenip hangilerinin görüntülenmeyeceğini seçmek için _source'u filtreleyebiliriz.

    Depolamayı true olarak ayarlarsanız, gereksiz olan _source'a ek olarak fazladan bir veri parçası da depolanır, bu nedenle depoyu genellikle false olarak ayarlarız. Aslında, store varsayılan değeri false'tur.

    artırmak

    Motivasyon faktörü, bu Lucene'deki ile aynı

    Diğerleri tek tek anlatılmayacak ve fazla kullanılmamaktadır.Lütfen resmi belgelere bakınız:

    Orijinal bağlantı:

    https://blog.csdn.net/mr_xinchen/article/details/104231377

    Java 11 yükseltmesi: "borç" ve "kriz"
    önceki
    Milyarlarca Wi-Fi cihazı kusurludur ve iletişimler kolayca dinlenebilir
    Sonraki
    Google ve Microsoft arasındaki tarayıcı savaşı
    Linux ana masaüstü işletim sistemi olacak mı?
    Tıbbi ekip "alamaz"! Jingzhou Guangdong İnternet Hastanesi, günde 2.000'den fazla kişiye hizmet veriyor
    Guangzhou 1 Nolu Sürücü Okulu sadece 5.000 ödeyebileceklerini iddia etti ve öğrencilere tazminat alamazlarsa 3.000 daha ödeme yapmaları önerildi.
    Runaway A hisseleri: Yüksek tüketici stoklarının peşinde koşuyorsanız, evinizde gerçekten bir maden var mı?
    Hayattan çıkmak bir iplikle asılıdır! Geçmişte rüzgar enerjisi devleri bir azaltma limiti uyguladı, bu hisse senetleri de yüksek risk altında
    26 Ulusal Süper Lig'de 100 otomobil fabrikası üretimi durdurdu! Yılın ikinci yarısında "arabayı siparişlerle teslim etmek zor" olabilir! Çin'in otomobil endüstrisi nasıl gidiyor?
    Huaweinin en pahalı terminali "Smart Screen X65" satışa sunulacak Hongmeng OS'nin endüstri zincirini yönlendirmesi bekleniyor
    2019 yılına baktığımızda, demiryolu bu başarıları elde etti
    Türkiye Libya'ya asker gönderecek, sebebi basit değil
    "Sınıf Temsilcisi" Wang Ziyi sokak dansı "İyi Bir Sınıf" öğretir Feng Shuangbai, dansı manevi bir meşale olarak alır
    Shanxi lisesinin üçüncü sınıfı planlandığı gibi başlıyor ve ortaokul üçüncü sınıfı 25 Nisan'da okula başlayacak.
    To Top