ES tam metin arama motoru pring-boot-elasticsearch

spring-boot-starter-parent-1.5.9. RELEASE, spring-data-elasticsearch-2.1.9.RELEAS, elasticsearch-2.4.6 (5.0+ üstü JDK8 gerektirir)

22 Ocak 2018 itibariyle, en son ElasticSearch 6.1.2'ye ulaştı, ancak yaylı önyüklemenin güncelleme hızı, ElasticSearch'ün güncelleme hızının çok gerisinde. Şu anda, spring-boot tarafından desteklenen en son sürüm elasticsearch-2.4.6'dır.

Referans: https://github.com/spring-projects/spring-data-elasticsearch/wiki/SpringData-Elasticsearch---Spring-Boot---version-matrix

Erişim yöntemi

Spring-boot'ta spring-data-elasticsearch kullanarak, iki yerleşik istemci erişimini kullanabilirsiniz.

1. Düğüm istemcisi: Yapılandırma dosyasında yerel: yanlış olarak ayarlayın. Düğüm istemcisi, kümeye veri olmadan bir düğüm yöneticisi veya düğüm istemcisi olarak katılır. Başka bir deyişle, herhangi bir verinin kendisini depolamaz, ancak Verinin kümedeki belirli konumunu bilin ve isteği doğrudan ilgili düğüme iletebilme.

2. Taşıma istemcisi: Yapılandırma dosyasında local: true olarak ayarlayın, bu daha hafif aktarım istemcisi uzak kümelere istek gönderebilir. Kümenin kendisine katılmaz, sadece istekleri kümedeki düğümlere iletir. Her iki Java istemcisi de Elasticsearch Aktarım Protokolünü (Elasticsearch Aktarım Protokolü) kullanarak, bağlantı noktası 9300 aracılığıyla kümeyle etkileşim kurar. Kümedeki düğümler ayrıca 9300 numaralı bağlantı noktası üzerinden iletişim kurar. Bu bağlantı noktası açık değilse, düğümleriniz bir küme oluşturamaz.

Servis açıklaması

Yerel ElasticSearch hizmetini (application-dev.properties) kullanın

spring.data.elasticsearch.cluster-name = elasticsearch # Varsayılan yerel makinedir.Uzak bir sunucu veya bir LAN sunucusu kullanmak istiyorsanız, ip: prot'i burada yapılandırmanız gerekir; bir kümeye eşdeğer olan virgülle ayrılmış çoklu yapılandırabilirsiniz. # Java istemcisi: 9300 numaralı bağlantı noktası üzerinden kümeyle etkileşim kurun # Diğer programlama dilleri: RESTful API, Elasticsearch ile 9200 numaralı bağlantı noktası üzerinden iletişim kurmak için kullanılabilir. # spring.data.elasticsearch.cluster-nodes = 192.168.1.180: 9300

Uzaktan ElasticSearch hizmetini kullanın (application-dev.properties)

  • ElasticSearch'ü kendiniz yüklemeniz gerekir. ElasticSearch sürümünün JAR paketi ile olabildiğince tutarlı olması gerektiğini unutmayın.
  • İndirme bağlantısı: https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-6
  • Kurulum talimatları:
  • Yeni sürümün kök kullanıcı tarafından başlatılması önerilmez. Kendi ElasticSearch kullanıcınızı oluşturmanız gerekir. Ayrıca elasticsearch'ü aşağıdaki komutla başlatabilirsiniz -Des.insecure.allow.root = true -d veya ES_JAVA_OPTS = "- Des.insecure.allow.root = true ".

Proje yapısı

src

ana

java

com

itstyle

es

Application.java

yaygın

sabit

PageConstant.java

algılayıcı

MyAdapter.java

log

denetleyici

LogController.java

entity

Pages.java

SysLogs.java

repository

ElasticLogRepository.java

service

LogService.java

impl

LogServiceImpl.java

kaynaklar

application-dev.properties

application-prod.properties

application-test.properties

application.yml

yay-bağlam-dubbo.xml

statik

iview

iview.css

iview.min.js

yazı tipleri

ionicons.eot

ionicons.svg

ionicons.ttf

ionicons.woff

jquery

jquery-3.2.1.min.js

vue

vue.min.js

şablonlar

log

index.html

webapp

index.jsp

WEB-INF

web.xml

test

java

com

itstyle

es

test

Logs.java

Proje demosu

Demo URL'si:

Proje ekran görüntüsü

Sayfalama sorgusu

ElasticsearchTemplate şablonunu 200.000 veri parçası, yerel harici ağ sunucusu (1 çekirdek 1G) eklemek için kullanmak, 60 saniyeden fazla sürdü, yaklaşık bir dakika. Dizin kitaplığı kapasitesi artmış olmasına rağmen, onu aramak yaklaşık 10 dakika sürdü.

Sayfalama sorgusu 10000 + 'a ulaştığında, sistem bir hata bildirir, Sonuç penceresi çok büyüktür, elasticsearch.yml dosyasını config altında değiştirin ve aşağıdaki kodu ekleyin:

# Miktarı özelleştirin index.max_result_window: '10000000'

Referans: https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

Java API

Elasticsearch, Java kullanıcıları için iki yerleşik istemci sağlar:

  • Düğüm istemcisi:

Düğüm istemcisi, adından da anlaşılacağı gibi, Elasticsearch kümesinin ayrılmaz bir parçasıdır. Kümeyi veri yok düğümü olarak birleştirin.Başka bir deyişle, herhangi bir veriyi kendisi depolamaz, ancak kümedeki verinin belirli konumunu bilir ve talebi doğrudan ilgili düğüme iletebilir.

  • Nakliye müşterisi:

Bu daha hafif aktarım istemcisi, uzak kümelere istek gönderebilir. Kümenin kendisine katılmaz, sadece istekleri kümedeki düğümlere iletir. Her iki Java istemcisi de Elasticsearch Aktarım Protokolünü (Elasticsearch Aktarım Protokolü) kullanarak, bağlantı noktası 9300 aracılığıyla kümeyle etkileşim kurar. Kümedeki düğümler ayrıca 9300 numaralı bağlantı noktası üzerinden iletişim kurar. Bu bağlantı noktası açık değilse, düğümleriniz bir küme oluşturamaz.

Elasticsearch-Head'i takın

Elasticsearch-head, küme üzerinde aptalca işlemler gerçekleştirebilen arabirim tabanlı bir küme işlemi ve yönetim aracıdır. Bir eklenti (tercih edilen yol) aracılığıyla es'e entegre edebilir veya bağımsız bir web uygulaması olarak kurabilirsiniz.

es-head'in üç ana işlemi vardır:

  • Kümenin topolojisini görüntüleyin ve dizin ve düğüm seviyesi işlemleri gerçekleştirebilme
  • Arama arayüzü, kümedeki orijinal json veya tablo formatında alınan verileri sorgulayabilir
  • Kümenin durumuna hızlı bir şekilde erişme ve görüntüleme yeteneği

Eklenti yükleme yöntemi, referans: https://github.com/mobz/elasticsearch-head

  • Elasticsearch 5.x için: site eklentileri desteklenmez. Bağımsız bir sunucu olarak çalıştırın
  • Elasticsearch 2.x için: sudo elasticsearch / bin / plugin install mobz / elasticsearch-head
  • Elasticsearch 1.x için: sudo elasticsearch / bin / plugin -install mobz / elasticsearch-head / 1.x
  • Elasticsearch 0.x için: sudo elasticsearch / bin / plugin -install mobz / elasticsearch-head / 0.9

Kurulum başarılı olduktan sonra, eklentiler dizininde kurulumun başarılı olduğunu gösteren bir baş dizini görünecektir.

Ekran görüntülerine göz atın:

x-pack izleme

Elasticsearch ve Logstash, Kibana'nın adlandırma yükseltmesiyle doğrudan 2.4'ten 5.0'a sıçradı. ELK'nin 5.x sürümü, sürüm yazışmaları için nispeten yüksek gereksinimlere sahip ve artık 5.x ve 2.x'in karmasını desteklemiyor. Aynı zamanda, Elastic bir paket oluşturdu. , X-pack'i oluşturmak için orijinal harikayı, saati ve uyarıyı kapsülledi.

Kurulum: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/installing-xpack-es.html

Kullanıcı yönetimi

X-pack kurulduktan sonra, varsayılan şifresi changeme olan ve tüm indeksler ve veriler üzerinde kontrol sahibi olan bir süper kullanıcı elastiki vardır.Bu kullanıcı diğer kullanıcıları oluşturmak ve değiştirmek için kullanılabilir.Elbette kullanıcılar ve kullanıcılara kibana'nın web arayüzü üzerinden erişilebilir. Grup yönetimi.

Esnek kullanıcının şifresini değiştirin:

curl -XPUT -u elastik'localhost: 9200 / _xpack / security / user / elastik / _password '-d' { "şifre": "123456" } '

Elasticsearch için IK Analizi

İndirin ve kurun:

  • Ön derleme paketini buradan tek indirimli yöntem: https://github.com/medcl/elasticsearch-analysis-ik/releases unzip eklentisini, your-es-root / plugins /
  • Kurulum yöntemi bir veya iki kullanımlık elasticsearch-eklentisi (sürüm > v5.5.1): ./bin/elasticsearch-plugin kurulum https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip

Elasticsearch sürümü 2.4.6 olduğundan, burada seçilen IK sürümü 1.10.6'dır.

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.10.6/elasticsearch-analysis-ik-1.10.6.zip

İndirip sıkıştırmayı açtıktan sonra, aşağıdaki kodu Elasticsearch'ün yapılandırması altındaki elasticsearch.yml dosyasına ekleyin (2.0'ın üzerine ayarlamanız gerekmez).

dizin: analiz: analizör: ik: takma ad: tür: org.elasticsearch.index.analysis.IkAnalyzerProvider ik_max_word: tür: ik use_smart: yanlış ik_smart: tür: ik use_smart: true

veya

index.analysis.analyzer.ik.type: "ik"

Kurulumdan önce:

Seni seviyorum Çin { "jetonlar": }

Yüklemeden sonra:

Seni seviyorum Çin { "jetonlar": }

veri senkronizasyonu

MySql'i elasticsearch ile senkronize etmek için üçüncü taraf araç kitaplığı elasticsearch-jdbc'yi kullanın.

Çalışma ortamı:

centos7.5, JDK8, elasticsearch-jdbc-2.3.2.0

kurulum adımları:

  • Liste metninin ilk adımı şu şekildedir: indirme (çok sıkışmış olabilir, lütfen sabırlı olun) wget .2.0-dist.zip
  • İşte liste metninin ikinci adımı: unzip elasticsearch-jdbc-2.3.2.0-dist.zip
  • Liste metninin üçüncü adımı: yapılandırma betiği mysql_import_es.sh
#! / bin / sh # elasticsearch-jdbc yükleme yolu bin = / home / elasticsearch-jdbc-2.3.2.0 / bin lib = / home / elasticsearch-jdbc-2.3.2.0 / lib Eko'{ "type": "jdbc", "jdbc": { # Veritabanında bir Json dosyası varsa, bunu false olarak ayarlayın, aksi takdirde senkronizasyon hataları "Detect_json": yanlış, "url": "jdbc: mysql: //127.0.0.1: 3306 / itstyle_log ?? useUnicode = truecharacterEncoding = utf-8useSSL = falseallowMultiQueries = true", "user": "root", "password": "root", # Otomatik olarak _id oluşturmak istiyorsanız, ilk alma alanını kaldırmanız yeterlidir; Id'yi birincil anahtar olarak istiyorsanız, id'yi _id olarak ayarlayın "sql": "SELECT id AS _id, id, user_id AS user_id, username, operation, time, method, params, ip, device_type AS deviceType, log_type AS logType, exception_detail AS exceptionDetail, gmt_create AS gmtCreate, plat_from AS platFrom FROM sys_log ", "elasticsearch": { "ana bilgisayar": "127.0.0.1", # elasticsearch hizmet adresi "bağlantı noktası": "9300" #Remote elasticsearch hizmeti Bu bağlantı noktası açık olmalıdır }, "dizin": "elasticsearch", # dizin adı kitaplığa eşdeğerdir "type": "sysLog" # Tür adı tabloya eşdeğerdir } } '| java \ -cp "$ {lib} / *" \ -Dlog4j.configurationFile = $ {bin} /log4j2.xml \ org.xbib.tools.Runner \ org.xbib.tools.JDBCImporter
  • İşte liste metninin dördüncü kısmı: Yetkilendir ve çalıştır
chmod + x mysql_import_es.sh ./mysql_import_es.sh

ElasticSearchRepository ve ElasticSearchTemplate

Spring-data-elasticsearch, Spring tarafından sağlanan ve ElasticSearch verilerini kolayca çalıştırabileceğiniz çok sayıda temel işlemi kapsayan ElasticSearch'ü çalıştırmaya yönelik veri katmanıdır.

ElasticSearchRepository'nin temel kullanımı

/ ** * @param < T > * @param < İD > * @author Rizwan Idrees * @author Mohsin Husen * / @HaberturkTV genel arayüz ElasticsearchRepository < T, ID Serileştirilebilir'i genişletir > ElasticsearchCrudRepository'yi genişletir < T, ID > { < S T'yi uzatır > S endeksi (S varlığı); Tekrarlanabilir < T > arama (QueryBuilder sorgusu); Sayfa < T > arama (QueryBuilder sorgusu, Sayfalandırılabilir sayfalanabilir); Sayfa < T > arama (SearchQuery searchQuery); Sayfa < T > searchSimilar (T varlık, Dize alanları, Sayfalanabilir sayfalanabilir); geçersiz yenileme (); Sınıf < T > getEntityClass (); }

ElasticsearchRepository'de birkaç özel arama yöntemi vardır. Bunlar ES'ye özgüdür ve sıradan JPA'dan farklıdır. Bazı ES sorgularını oluşturmak için kullanılırlar. Temelde QueryBuilder ve SearchQuery'nin iki parametresine bağlıdır.Bazı özel sorguları tamamlamak, esas olarak bu iki parametrenin yapılandırılmasına bağlıdır.

Normal koşullar altında, doğrudan yeni NativeSearchQuery değiliz, ancak NativeSearchQueryBuilder kullanıyoruz. NativeSearchQueryBuilder.withQuery (QueryBuilder1) .withFilter (QueryBuilder2) .withSort (SortBuilder1) .withXXXX (). Build (); bu şekilde NativeSearchQuery'nin yapımını tamamlayabilirsiniz.

ElasticSearchTemplate kullanımı

ElasticSearchTemplate, daha düşük seviyeli yöntemler sağlayan ESRepository'ye ek niteliğindedir.

Burada esas olarak hızlı okuma ve toplu ekleme işlevini uyguluyoruz, 200.000 parça veri, yerel harici ağ sunucusu (1 çekirdek 1G), 60s +, yaklaşık bir dakika sürüyor. Dizin kitaplığı kapasitesi artmış olmasına rağmen, onu aramak yaklaşık 10 dakika sürdü.

// Toplu senkronizasyon veya veri ekleme public void bulkIndex (Liste < SysLogs > logList) { uzun başlangıç = System.currentTimeMillis (); int sayaç = 0; Deneyin { Liste < IndexQuery > sorgular = new ArrayList < > (); for (SysLogs log: logList) { IndexQuery indexQuery = new IndexQuery (); indexQuery.setId (log.getId () + ""); indexQuery.setObject (günlük); indexQuery.setIndexName ("elasticsearch"); indexQuery.setType ("sysLog"); // Ayrıca IndexQueryBuilder'ı kullanarak // IndexQuery index = new IndexQueryBuilder (). WithId (person.getId () + "") .withObject (person) .build (); queries.add (indexQuery); eğer (counter% 1000 == 0) { elastikSearchTemplate.bulkIndex (sorgular); queries.clear (); System.out.println ("bulkIndex sayacı:" + sayaç); } sayaç ++; } eğer (queries.size () > 0) { elastikSearchTemplate.bulkIndex (sorgular); } uzun uç = System.currentTimeMillis (); System.out.println ("bulkIndex kullanım süresi tamamlandı:" + (bitiş-başlangıç)); } catch (İstisna e) { System.out.println ("IndexerService.bulkIndex e;" + e.getMessage ()); e atmak; } }

Redis günlük sırası

Pakete bakın: com.itstyle.es.common.redis

RedisListener konfigürasyonunu izleme:

@Bileşen public class RedisListener { private static final Logger LOGGER = LoggerFactory.getLogger (RedisListener.class); @Fasulye RedisMessageListenerContainer kapsayıcısı ( RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { LOGGER.info ("İzlemeyi başlat"); RedisMessageListenerContainer container = new RedisMessageListenerContainer (); container.setConnectionFactory (connectionFactory); container.addMessageListener (listenerAdapter, new PatternTopic ("itstyle_log")); iade konteyneri; } @Fasulye MessageListenerAdapter listenerAdapter (Alıcı alıcı) { yeni MessageListenerAdapter döndürür (alıcı, "ReceiveMessage"); } @Fasulye Alıcı alıcı (CountDownLatch mandalı) { yeni Alıcıyı iade et (mandal); } @Fasulye CountDownLatch mandalı () { yeni CountDownLatch (1) döndür; } @Fasulye StringRedisTemplate şablonu (RedisConnectionFactory connectionFactory) { yeni StringRedisTemplate (connectionFactory) döndür; } }

Günlük Alma Alıcısı:

public class Receiver { private static final Logger LOGGER = LoggerFactory.getLogger (Receiver.class); @Autowired özel ElasticLogRepository ElasticLogRepository; özel CountDownLatch mandalı; @Autowired public Receiver (CountDownLatch mandalı) { this.latch = mandal; } public void receMessage (Dize mesajı) { LOGGER.info ("Günlük mesajını al < {} > ",İleti); eğer (mesaj == null) { LOGGER.info ("Günlük mesajını al < "+ boş +" > "); }Başka { ObjectMapper eşleştiricisi = new ObjectMapper (); Deneyin { SysLogs günlüğü = mapper.readValue (mesaj, SysLogs.class); elastikLogRepository.save (günlük); LOGGER.info ("Günlük mesaj içeriğini al < {} > ", log.getOperation ()); } catch (JsonParseException e) { e.printStackTrace (); } catch (JsonMappingException e) { e.printStackTrace (); } catch (IOException e) { e.printStackTrace (); } catch (İstisna e) { e.printStackTrace (); } } latch.countDown (); } }

git adresi: https://gitee.com/52itstyle/spring-boot-elasticsearch

Weng Fan ve 54 yaşındaki Yang Zhenning, 15 yıldır evliler ve bunun arkasındaki sebepler takdire şayan.
önceki
Çin (Changsha) Uluslararası İnşaat Makineleri Fuarı'na büyük paletli vinçler giriyor
Sonraki
Hanfu "Refah": arz yetersizliğinde talep yükseliyor, ancak brüt kar marjı markalı modadan çok daha düşük
4 kez 3200 yuan çalmak! Affetmek için hırsız ve patron WeChat: Polisi aramayın
50 yaşındaki Weng Hong, son fotoğraflarında bitkin görünüyor, netizen: Tanrıça yaşlı
redis izleme redis-monitör
Neymar Wu Lei burada! Kaisa Grubu el ele verdi, bu yaz Çin ile çift uluslararası kupa maçı
Odak Analizi | Bytedance Mini Programı altı aydır çevrimiçi olduktan sonra ne durumda?
jytask bir görev zamanlama birleşik yönetim platformu
Ben bir DQL'im
Gerçekten, Sterling netizenlerden Walker'ın uçaksavar topçusunu tekrar oynatmasını istedi ve alay etti: bu korkunç
Tıbbi bakım "palmografi": hassas olmaktan sertliğe kadar, bu departmandaki her kişi günde 100 defa ellerini yıkar.
Mi Mural TV'nin derinlemesine deneyimi: Muhtemelen şu anda büyük ekran bir kontrol merkezi kullanmak en iyisidir
Huawei, pop-up lift yapısına sahip yeni bir ön kamera olan uyumlu Android Q modellerinin ilk grubunu duyurdu
To Top