package com.example.demo3;
import com.example.pojo.Article;
import com.example.service.ArticleService;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.*;
import java.util.ArrayList;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
@SpringBootTest
class Demo3ApplicationTests {
private static final String[] titles = {"行宫", "静夜思", "闺怨", "九月九日忆山东兄弟"};
private static final String[] content = {"寥落古行宫,宫花寂寞红。\n" +
"白头宫女在,闲坐说玄宗。", "床前明月光,疑是地上霜。\n" +
"举头望明月,低头思故乡", "闺中少妇不知愁,春日凝妆上翠楼。\n" +
"忽见陌头杨柳色,悔教夫婿觅封侯。", "独在异乡为异客,每逢佳节倍思亲。\n" +
"遥知兄弟登高处,遍插茱萸少一人。"};
@Autowired
ElasticsearchTemplate et;
@Test
void findAll() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery()).build();
System.out.println(et.queryForList(searchQuery, Article.class));
// System.out.println(p);
}
@Test
public void findBy() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("", "")).build();
System.out.println(et.queryForList(searchQuery, Article.class));
}
@Test
public void add() {
Article p = new Article().setTitle("上山").setContent("fuckkk");
IndexQuery iq = new IndexQueryBuilder().withObject(p).build();
et.index(iq);
}
/**
* 批量插入古诗
*/
@Test
public void addList() {
ArrayList<IndexQuery> list = new ArrayList<>();
for (int i = 0; i < titles.length; ++i) {
Article p = new Article().setTitle(titles[i]).setContent(content[i]);
IndexQuery iq = new IndexQueryBuilder().withObject(p).build();
list.add(iq);
}
et.bulkIndex(list);
}
@Test
public void queryAll() {
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.build();
System.out.println(et.queryForList(searchQuery, Article.class));
}
/**
* title or content 包含 "上"
*/
@Test
public void findOr()
{
QueryBuilder p = QueryBuilders.
boolQuery()
.should(QueryBuilders.matchPhraseQuery("title","上"))
.should(QueryBuilders.matchPhraseQuery("content","上"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withFilter(p).build();
System.out.println(et.queryForList(searchQuery, Article.class));
}
/**
* title or content 包含 "上"
* 分页查询
*/
@Test
public void findOrPage()
{
QueryBuilder p = QueryBuilders.
boolQuery()
.should(QueryBuilders.matchPhraseQuery("title","上"))
.should(QueryBuilders.matchPhraseQuery("content","上"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withFilter(p).build();
// System.out.println(et.queryForList(searchQuery, Article.class));
Pageable pageable = PageRequest.of(0,6);
searchQuery.setPageable(pageable);
Page page = et.queryForPage(searchQuery,Article.class);
// System.out.println(page.getContent());
page.getContent().forEach(System.out::println);
System.out.println(page.getTotalElements());
}
}
package com.example.pojo;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import java.io.Serializable;
/**
* @Author lyr
* @create 2020/1/20 0:12
*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
// @Builder
@Document(indexName = "dev-index1",type = "article")
public class Article implements Serializable {
@Field(index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")//指定查询字段,指定查询所用的分词算法
private String title;
@Field(index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")//指定查询字段,指定查询所用的分词算法
private String content;
}
这里补充一下,存储的时候 尽量细粒度索引,查询的时候尽量粗粒度索引