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: 9300Uzaktan ElasticSearch hizmetini kullanın (application-dev.properties)
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, 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.
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:
Eklenti yükleme yöntemi, referans: https://github.com/mobz/elasticsearch-head
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:
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: trueveya
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ı:
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