目录
2.2.9、 ids搜索(id集合查询)(ids query)
一、准备
1.1、依赖
<elasticsearch.version>7.12.1</elasticsearch.version>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
1.2、测试数据
PUT /yuangong
{
"settings": {},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"alias": {
"type": "text"
},
"age": {
"type": "integer"
},
"sex": {
"type": "keyword"
},
"phone": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"slogan": {
"type": "text"
}
}
}
}
POST /yuangong/_doc/
{
"name": "张三三",
"alias": "小张",
"age": 28,
"sex": "男",
"phone": 183xxxx0000,
"title": "初级Java开发",
"slogan": "苟富贵,勿相忘"
}
POST /yuangong/_doc/
{
"name": "李四",
"alias": "小四",
"age": 25,
"sex": "男",
"phone": 183xxxx0001,
"title": "高级Java开发",
"slogan": "行路难,行路难,多歧路,今安在"
}
POST /yuangong/_doc/
{
"name": "王五",
"alias": "五哥",
"age": 30,
"sex": "男",
"phone": 183xxxxx0002,
"title": "资深Java开发",
"slogan": "逾期感慨路难行,不如马上出发"
}
POST /yuangong/_doc/
{
"name": "王六",
"alias": "名与",
"age": 28,
"sex": "男",
"phone": 183xxxx0003,
"title": "高级前端开发",
"slogan": "超越自己"
}
POST /yuangong/_doc/
{
"name": "王狗蛋",
"alias": "狗蛋",
"age": 31,
"sex": "男",
"phone": 183xxxx0004,
"title": "高级产品经理",
"slogan": "明哲保身"
}
POST /yuangong/_doc/
{
"name": "王麻子",
"alias": "逍遥子",
"age": 30,
"sex": "女",
"phone": 183xxxx0005,
"title": "资深业务专家",
"slogan": "鹏之大不知其几千里也"
}
POST /yuangong/_doc/
{
"name": "周二",
"alias": "二子",
"age": 22,
"sex": "男",
"phone": 18300000006,
"title": "初级测试开发",
"slogan": "冷冷的冰雨在我脸上胡乱的拍"
}
二、案例
2.1、全文搜索
2.1.1、匹配搜索(会拆词)
和数据类型有关
(1)如果被查询的字段是keywork,查询的时候只能全量匹配,不会被拆分
(2)如果查询字段类型是text,查询的值会根据查询字段的分词器进行分词
如:如果没有设置分词器,张三三会拆成张、三、三,匹配出包含【张】或者【三】或者【三】的数据
如:如果设置IK分词器,
"name": {"type": "text","analyzer": "ik_max_word"} |
张三三会拆成张三、三三,匹配出包含【张三】或者【三三】的数据
如:如果设置IK分词器,三三会拆成三三,匹配出包含【三三】的数据
(3)上面使用的是默认的operator默认OR, 设置operator为AND的时候
如:如果没有设置分词器,张三三会拆成张、三、三,匹配出包含【张】并且【三】并且【三】的数据
如:如果设置IK分词器,张三三会拆成张三、三三,匹配出包含【张三】并且【三三】的数据
如:如果设置IK分词器,三三会拆成三三,匹配出包含【三三】的数据
public void matchQuery() throws IOException {
// 搜索请求对象
SearchRequest searchRequest = new SearchRequest("yuangong");
// 搜索源构建对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "三三").operator(Operator.OR);
doSearch(searchRequest,sea