昨天做了好久,一直查不出来,后来发现是我的索引设计和分词器设计有问题。
创建索引
"settings": {
"analysis": {
"analyzer": {
"my_pinyin": {
"tokenizer": "ik_smart",
"filter": [
"pinyin"
]
}
},
"filter": {
"pinyin": {
"type": "pinyin",
"keep_full_pinyin": true,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true
}
}
}
这是把ik分词器当做主要分词,拼音分词次要。
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"title": {
"type": "completion",
"analyzer": "my_pinyin"
},
"name": {
"type": "text",
"analyzer": "my_pinyin"
},
"cover_bucket":{
"type": "keyword"
},
"cover_object":{
"type": "keyword"
}
}
}
一开始写错了,除了定义了一个analyzer,还另外写了一个search-analyzer,所以就不对了,多此一举。
相关查询
1.matchQuery
SearchSourceBuilder sourceBuilder= new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("name","手机"))
2.termQuey
SearchSourceBuilder sourceBuilder= new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.termQuery("name","手机"))
上述两种搜索都是基本搜索,但是前者是知道有分词器的存在,后者是不知道分词器的存在(适合keyword,datetime,int类型)
3.排序搜索
sourceBuilder.sort(searchParamDTO.getSortBy(),searchParamDTO.getDesc()? SortOrder.ASC: SortOrder.DESC);
4.高亮搜索
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field(SearchConstants.DEFAULT_SEARCH_FIELD).preTags(SearchConstants.DEFAULT_PRE_TAG).postTags(SearchConstants.DEFAULT_POST_TAG);
sourceBuilder.highlighter(highlightBuilder);
5.范围搜索
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.rangeQuery(key).gt(first).lt(end));
大于小于等于
6.模糊搜索
FuzzyQueryBuilder fuzzyQuery = new FuzzyQueryBuilder("name","手机");
fuzzyQuery.fuzziness(Fuzziness.TWO);
默认模糊搜索的度最大是2。

7.分页
sourceBuilder.from(searchParamDTO.getFrom());//分页
sourceBuilder.size(searchParamDTO.getSize());
看了还有聚合搜索什么的 我得好好看看了。886
本文分享了一次解决搜索引擎中索引设计和分词器配置问题的经验,详细介绍了使用ik分词器与拼音分词相结合的方法,并给出了具体的Elasticsearch设置及查询案例。
2076

被折叠的 条评论
为什么被折叠?



