tags: ElasticSearch, java
ElasticSearchRepository
关键字介绍
term
查询是直接通过倒排索引指定的词条进行查找的,所以,很显然,term
查询效率肯定比match
要高。
==term精确匹配==
代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对搜索词进行查找;
==match==
根据定义的分词器默认standar
对搜索词进行拆分,根据拆分结果逐个进行匹配
。特点是可以查出大量可能相关联的数据,但是准确率低。
==match_phrase==
短语匹配,同样会对搜索词拆分,但是所有拆分结果都必须包含,并且顺序一致,中间没有插入其他词语。特点是准确率高,但是最终匹配结果集较小。
==wildcard==
通配符模式的模糊匹配,使用简单,但是性能较慢。
支持以下2种通配符:?,匹配一个字符
*,匹配零个或多个字符
官方建议:尽量避免在开头加通配符 ? 或者 *,这样会明显降低查询性能
ElasticSearchRepository基础方法
java配置文件
//端口配置
spring.elasticsearch.rest.uris= http://localhost:9200
//集群名称
spring.elasticsearch.rest.username= xy_elastic
接口需要继承ElasticSearchRepository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item, Long> {
}
接口基础用法
实体类
@Data
@ToString
/*
*indexName : 文档名称
*shards: 分片数量,默认1
*/
@Document(indexName = "item", shards = 5)
public class Item implements Serializable {
@Id
private Long id;
@Field(type = FieldType.Text , analyzer = "ik_max_word")
private String title;
@Field(type = FieldType.Long)
private Long price;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
}
ElasticSearchRepository已封装方法
@Autowired
private ItemRepository itemRepository;
//实体类
Item item = new Item();
item.setId(1L);
item.setTitle("ElasticSearch目前最新的已到7X");
item.setPrice(30000L);
//保存 或 更新
itemRepository.save(item);
//删除
itemRepository.deleteById(id);
/**
* 通过id获取信息
*
* @param id id
* @return {@link Item}
*/
public Item esGetInfoById(Long id){
Optional<Item> item = itemRepository.findById(id);
return item.get();
}
ItemRepository自定义方法
/**
* 获取页面项目
*
* @param keyWord 关键字
* @param pageable 可分页
* @return {@link Page<Item>}
*/
public Page<Item> getPageItems(String keyWord, Pageable pageable) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// 构建布尔查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
/**
* must 多条件 &(并且)
* mustNot 多条件 != (非)
* should 多条件 || (或)
*/
// 关键字查询
boolQueryBuilder.must(QueryBuilders.matchQuery("title",keyWord));
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
nativeSearchQueryBuilder.withPageable(pageable);
return itemRepository.search(nativeSearchQueryBuilder.build());
}