目录
1、文档检索与排序
2、文档聚合操作
详情
1、文档检索与排序
- 检索分类
- 结构化检索
- 针对字段类型: 日期、时间、数字类型,以及精确的文本匹配。
- 1)结构化查询,我们得到的结果 总是 非是即否,要么存于集合之中,要么存在集合之外。
- 2)结构化查询不关心文件的相关度或评分;它简单的对文档包括或排除处理。
- 全文检索
- 全文检索通常用于在全文本字段(如电子邮件正文,网页正文,标题)上运行全文查询。
- 目标字段要提前进行索引分词等处理,亦可在搜索前对输入进行搜索分词操作,还可以增加逻辑关系、匹配度打分过滤等因子,辅助更灵活的全文检索要求。
- 一般是会根据类TF/IDF算法,对搜索出来的文档进行打分操作。
- TF/IDF算法
- 一种用于信息检索与数据挖掘的常用加权技术,打分公式类似于: score=TF * IDF
- TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
- 核心思想: 如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- 复合检索、GEO等其它类检索
- 后续在实战使用当中,进一步扩展与深化。
- 1)结构化查询,我们得到的结果 总是 非是即否,要么存于集合之中,要么存在集合之外。
- 针对字段类型: 日期、时间、数字类型,以及精确的文本匹配。
- 常用检索类型说明
- term检索:对输入的搜索词不进行分词处理,直接作为一个term去目标字段中匹配是否存在相同的term。
- query_string检索:对输入的搜索词进行搜索分词处理后得到1或多个term,并将这些term去目标字段中匹配,是否存在相同的term,并按照类TF/IDF算法对命中结果打分与排序计算。
- wildcard检索:模糊查询,对输入的搜索词不进行分词处理,直接与目标字段中的term集合进行模糊匹配,支持*,?等正则表达式语法。
- range检索:范围检索,主要是针对数值、日期类型字段进行操作。
- missing检索:判断某个type是否存在某个field字段,若存在则返回False,不存在则返回True。
- 常用检索需求
- 1、在索引index_from_tc,类型type_from_tc的title字段中,term搜索“中国”的结果集的top20(默认是top10)。
- 结构化检索
/**
* term匹配搜索指定关键词
*
* @param indexName
* @param typeName
*/
public void searchByTermQuery(String indexName, String typeName) {
// 构造query
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
"中国");
// 将数据发送到服务器端
SearchResponse response = this.client.prepareSearch(indexName)
.setTypes(typeName).setQuery(termQueryBuilder).setFrom(0)
.setSize(20).execute().actionGet();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
Map source = searchHit.getSourceAsMap();
System.out.println(source);
}
}
public static void main(String[] args) throws IOException {
// 初始化client工具类
TransportClientUtil transportClient = new TransportClientUtil();
// 创建索引
String indexName = "index_from_tc";
String typeName = "type_from_tc";
transportClient.searchByTermQuery(indexName, typeName);
System.out.println("done");
}
2、在索引index_from_tc,类型type_from_tc的title字段中,term搜索“中国”的结果集中,按发布时间排序后的top20。
/**
* 通过term string来搜索后,按某字段排序
*
* @param indexName
* @param typeName
*/
public void searchByTermQueryWithSort(String indexName, String typeName) {
// 构造query
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
"中国");
// 将数据发送到服务器端
SearchResponse response = this.client.prepareSearch(indexName)
.setTypes(typeName).setQuery(termQueryBuilder)
.addSort("post_time", SortOrder.DESC).setFrom(0).setSize(20)
.execute().actionGet();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
Map source = searchHit.getSourceAsMap();
System.out.println(source);
}
}
public static void main(String[] args) throws IOException {
// 初始化client工具类
TransportClientUtil transportClient = new TransportClientUtil();
// 创建索引
String indexName = "index_from_tc";
String typeName = "type_from_tc";
transportClient.searchByTermQueryWithSort(indexName, typeName);
System.out.println("done");
}
2、文档聚合操作
- 聚合含义(aggregation)
- 对搜索结果进行统计分析,如按日期分组统计、求最大值、最小值等
- 同时可以获取明细信息
- 常见聚合需求
- 1、求所爬取新闻列表数据中,标题命中”中国”新闻中,最新的发布日期
- 对搜索结果进行统计分析,如按日期分组统计、求最大值、最小值等
/**
* 获取指定索引和类型下,最新的发布时间
*
* @param indexName
* @param typeName
*/
public void searchMaxPostTimeItem(String indexName, String typeName) {
// 构造query
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
"中国");
// 将数据发送到服务器端
SearchResponse response = this.client
.prepareSearch(indexName)
.setTypes(typeName)
.setQuery(termQueryBuilder)
.addSort("post_time", SortOrder.DESC)
.setFrom(0)
.setSize(20)
.addAggregation(
AggregationBuilders.max("max_post_time").field(
"post_time")).execute().actionGet();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
Map source = searchHit.getSourceAsMap();
System.out.println(source);
}
Aggregations aggregations = response.getAggregations();
System.out.println(aggregations.getAsMap());
}
public static void main(String[] args) throws IOException {
// 初始化client工具类
TransportClientUtil transportClient = new TransportClientUtil();
// 创建索引
String indexName = "index_from_tc";
String typeName = "type_from_tc";
transportClient.searchMaxPostTimeItem(indexName, typeName);
System.out.println("done");
}
2、求所爬取新闻列表数据中,标题命中”中国”新闻中,最大和最小(旧)的发布日期
/**
* 获取指定索引和类型下,同时获取最新和最旧的的发布时间
*
* @param indexName
* @param typeName
*/
public void searchMaxAndMinPostTimeItem(String indexName, String typeName) {
// 构造query
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title",
"中国");
// 将数据发送到服务器端
SearchResponse response = this.client
.prepareSearch(indexName)
.setTypes(typeName)
.setQuery(termQueryBuilder)
.addSort("post_time", SortOrder.DESC)
.setFrom(0)
.setSize(20)
.addAggregation(
AggregationBuilders.max("max_post_time").field(
"post_time"))
.addAggregation(
AggregationBuilders.min("min_post_time").field(
"post_time")).execute().actionGet();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
Map source = searchHit.getSourceAsMap();
System.out.println(source);
}
Aggregations aggregations = response.getAggregations();
System.out.println(aggregations.getAsMap());
}
public static void main(String[] args) throws IOException {
// 初始化client工具类
TransportClientUtil transportClient = new TransportClientUtil();
// 创建索引
String indexName = "index_from_tc";
String typeName = "type_from_tc";
transportClient.searchMaxAndMinPostTimeItem(indexName, typeName);
System.out.println("done");
}
- 3、求所爬取新闻列表数据中,对应的发布时间分布
public void searchPosttimeDist4History(String indexName, String typeName) {
AggregationBuilder aggregation = AggregationBuilders
.dateHistogram("agg").field("post_time").format("yyyy-MM-dd")
.dateHistogramInterval(DateHistogramInterval.DAY);
// 将数据发送到服务器端
SearchResponse response = this.client.prepareSearch(indexName)
.setTypes(typeName).setQuery(QueryBuilders.matchAllQuery())
.addSort("post_time", SortOrder.DESC).setFrom(0).setSize(0)
.addAggregation(aggregation).execute().actionGet();
SearchHits hits = response.getHits();
for (SearchHit searchHit : hits) {
Map source = searchHit.getSourceAsMap();
System.out.println(source);
}
Aggregations aggregations = response.getAggregations();
System.out.println(aggregations.getAsMap());
}
public static void main(String[] args) throws IOException {
// 初始化client工具类
TransportClientUtil transportClient = new TransportClientUtil();
// 创建索引
String indexName = "index_from_tc";
String typeName = "type_from_tc";
transportClient.searchPosttimeDist4History(indexName, typeName);
System.out.println("done");
}
天亮教育是一家从事大数据云计算、人工智能、教育培训、产品开发、咨询服务、人才优选为一体的综合型互联网科技公司。
公司由一批BAT等一线互联网IT精英人士创建,
以”快乐工作,认真生活,打造高端职业技能教育的一面旗帜”为愿景,胸怀”让天下没有难找的工作”使命,
坚持”客户第一、诚信、激情、拥抱变化”的价值观,
全心全意为学员赋能提效,践行技术改变命运的初心。
更多学习讨论, 请加入
官方-天亮大数据交流-366784928
群二维码:
天亮教育公开课-从小白到大佬修成记-全系列视频地址:http://bbs.myhope365.com/forum.php?mod=viewthread&tid=1422&extra=page%3D1
欢迎关注天亮教育公众号,大数据技术资料与课程、招生就业动态、教育资讯动态、创业历程分享一站式分享,官方微信公众号二维码:
天亮教育官方群318971238,
爬虫、nlp技术qq群320349384
hadoop & spark & hive技术群297585251,
官网:http://myhope365.com
官方天亮论坛:http://bbs.myhope365.com/