SpringDataElasticSearch的基本使用


pom引入

 <dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>
	<!--  日志 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.24</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
	<!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
	<!--jackson  -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.1</version>
    </dependency>
	<!--  SpringDataElasticSearch  -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <version>3.0.5.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.elasticsearch.plugin</groupId>
                <artifactId>transport-netty4-client</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
	<!--  spring-test  方便測試  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
</dependencies>

applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
   xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/data/elasticsearch
		http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
		">
	<!--client客戶端配置 -->
<elasticsearch:transport-client id="es_client" cluster-name="my-elasticsearch"
	cluster-nodes="127.0.0.1:9301,127.0.0.1:9302,127.0.0.1:9303"/>
	<!--配置包掃描器掃描dao接口 -->
<elasticsearch:repositories base-package="com.springdata.respositories"/>

<!-- Elasticsearch 模板對象 -->
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<!-- 指向上方client客戶端 -->
	<constructor-arg name="client" ref="es_client"/>
</bean>
</beans>

實體類配置

<!--這里制定了索引的名稱以及type類型 -->
@Document(indexName ="spring_data_index   " ,type = "article")
public class Article {
// store:是否存儲    index:是否設置分詞,默認為true
// analyzer:存儲時使用分詞器
// searchAnalyzer:查詢時使用分詞器將查詢的字段進行分詞
@Id
@Field(store = true,type = FieldType.Long)
private long id;
@Field(store = true,type = FieldType.text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String title;
@Field(store = true,type = FieldType.text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String context;


public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getContext() {
    return context;
}

public void setContext(String context) {
    this.context = context;
}

@Override
public String toString() {
    return "Article{" +
            "id=" + id +
            ", title='" + title + '\'' +
            ", context='" + context + '\'' +
            '}';
}

}

配置接口

//接口中應該指定實體類以及ID的類型
public interface ArticleRespository extends ElasticsearchRepository<Article,Long> {

//要注意命名規則

//自定義查詢
List<Article> findByTitle(String str);
//根據多條件自定義查詢
List<Article> findByTitleOrContext(String title,String content);
List<Article> findByTitleOrContext(String title, String content, Pageable pageable);
}

常用步驟

//創建索引
@Autowired
private ArticleRespository articleRespository;
@Autowired
private ElasticsearchTemplate template;

@Test
public void createIndex() throws Exception{
    //創建索引,並配置映射關系
    template.createIndex(Article.class);
}

//添加Document
@Test
public void addDocument() throws  Exception{
    //創建一個對象
    Article article=new Article();
    article.setId(2);
    article.setTitle("maven項目對象模型,第二個");
    article.setContext("maven是一個開源項目管理工具,第二個");
    articleRespository.save(article);
}

//添加多個Document
@Test
public void addDocumentMore() throws  Exception{
    for(int i =3 ;i<10;i++){
        //創建一個對象
        Article article=new Article();
        article.setId(i);
        article.setTitle("maven項目對象模型,第"+i+"個");
        article.setContext("maven是一個開源項目管理工具,第"+i+"個");
        articleRespository.save(article);
    }
}

//刪除Document
@Test
public void deleteDocument() throws  Exception{
    articleRespository.deleteById(1l);
    //全部刪除
	//articleRespository.deleteAll();
}

 //修改
@Test
public void updateDocument() throws  Exception{
        //其實就是添加文檔,因為es是基於lucene的,所以修改的原理是先刪除再添加
        //所以更新文檔其實就是添加文檔,保持文檔與源文檔id一致,這樣就能覆蓋原有文檔起到更新的作用
     //addDocument();
}

//查詢  遍歷
@Test
public void searchDocument() throws  Exception{
    //!!!這不是迭代器
    Iterable<Article> articles = articleRespository.findAll();
    articles.forEach(article -> System.out.println(article));
}

//查詢  byId
@Test
public void searchById() throws  Exception {
    Optional<Article> optional = articleRespository.findById(3l);
    Article article = optional.get();
    boolean b = StringUtils.isEmpty(article);
    if (!b) {
        System.out.println(article);
    } else {
        System.out.println("無法查詢到該對象");
    }
}

//自定義查詢
@Test
public void searchByTitle(){
    List<Article> list = articleRespository.findByTitle("maven");
    list.stream().forEach(article -> System.out.println(article));
}

//自定義查詢 返回list
@Test
public void searchByTitleOrContent(){
    //查詢時是分詞查詢,每個詞之間是and關系,所以查詢的所有詞都應該包含在被查到的對象字段中
    List<Article> list = articleRespository.findByTitleOrContext("對象maven", "第3個");
    list.stream().forEach(article -> System.out.println(article));
}

//自定義查詢並設置分頁
@Test
public void searchByTitleOrContentByPage(){
    //設置分頁信息,默認從第0頁開始
    Pageable pageable= PageRequest.of(0,3);
    List<Article> list = articleRespository.findByTitleOrContext("第二個", "第5個",pageable);
    list.stream().forEach(article -> System.out.println(article));
}

//使用原生的查詢,查詢內容不需要完全匹配
//類似於QueryString
@Test
public void NativeSearchQuery() throws Exception{
    //創建一個查詢對象
    NativeSearchQuery query=new NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.queryStringQuery("maven是一個工程構建起").defaultField("title"))
            .withPageable(PageRequest.of(0,5))
            .withHighlightFields(new HighlightBuilder.Field("title").preTags("<font style='color:red'>").postTags("</font>"))
            .build();

    List<Article> articles = template.queryForList(query, Article.class);
    articles.stream().forEach(article -> System.out.println(article));
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM