tags: ElasticSearch, java
ElasticSearchRepository
關(guān)鍵字介紹
term
查詢是直接通過倒排索引指定的詞條進(jìn)行查找的,所以敢伸,很顯然,term
查詢效率肯定比match
要高埃篓。
==term精確匹配==
代表完全匹配,也就是精確查詢,搜索前不會再對搜索詞進(jìn)行分詞解析憾朴,直接對搜索詞進(jìn)行查找;
==match==
根據(jù)定義的分詞器默認(rèn)standar
對搜索詞進(jìn)行拆分喷鸽,根據(jù)拆分結(jié)果逐個進(jìn)行匹配
众雷。特點是可以查出大量可能相關(guān)聯(lián)的數(shù)據(jù),但是準(zhǔn)確率低。
==match_phrase==
短語匹配砾省,同樣會對搜索詞拆分鸡岗,但是所有拆分結(jié)果都必須包含,并且順序一致编兄,中間沒有插入其他詞語纤房。特點是準(zhǔn)確率高,但是最終匹配結(jié)果集較小翻诉。
==wildcard==
通配符模式的模糊匹配,使用簡單捌刮,但是性能較慢碰煌。
支持以下2種通配符:?,匹配一個字符
*绅作,匹配零個或多個字符
官方建議:盡量避免在開頭加通配符 ? 或者 *芦圾,這樣會明顯降低查詢性能
ElasticSearchRepository基礎(chǔ)方法
java配置文件
//端口配置
spring.elasticsearch.rest.uris= http://localhost:9200
//集群名稱
spring.elasticsearch.rest.username= xy_elastic
接口需要繼承ElasticSearchRepository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item, Long> {
}
接口基礎(chǔ)用法
實體類
@Data
@ToString
/*
*indexName : 文檔名稱
*shards: 分片數(shù)量,默認(rèn)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 關(guān)鍵字
* @param pageable 可分頁
* @return {@link Page<Item>}
*/
public Page<Item> getPageItems(String keyWord, Pageable pageable) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
// 構(gòu)建布爾查詢
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
/**
* must 多條件 &(并且)
* mustNot 多條件 != (非)
* should 多條件 || (或)
*/
// 關(guān)鍵字查詢
boolQueryBuilder.must(QueryBuilders.matchQuery("title",keyWord));
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
nativeSearchQueryBuilder.withPageable(pageable);
return itemRepository.search(nativeSearchQueryBuilder.build());
}