A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】Elasticsearch 学习笔记之得分(加权)
随着应用程序的增长,提高搜索质量的需求也进一步增大。我们把它叫做搜索体验。我们需要知道什么对用户更重要,关注用户如何使用搜索功能。这导致不同的结论,例如,有些文档比其他的更重要,或特定查询需强调一个字段而弱化其他字段。这就是可以用到加权的地方。
在Query和Field中可以设置加权
创建3条数据,通过加权影响我们的数据结果和得分
1.1. 在Query的查询中定义加权
【创建数据】
1:Article中添加一个属性
[AppleScript] 纯文本查看 复制代码
public class Article {

	private Integer id;
	private String title;
	private String content;
	private String comment;
}
2:重新创建索引和映射,创建文档
[AppleScript] 纯文本查看 复制代码
/**创建 索引*/
	@Test
	public void testCreateIndex_boost() throws Exception{
		// 创建索引
		client.admin().indices().prepareCreate("blog1").get();
		//关闭
		client.close();
	}
	
	/**
	 * 创建映射
	 */
	@Test
	public void testCreateIndexMapping_boost() throws Exception{
		//构建json的数据格式,创建映射
		XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
				.startObject()
					.startObject("article")
						.startObject("properties")
							.startObject("id")
								.field("type","integer").field("store", "yes")
							.endObject()
							.startObject("title")
								.field("type","string").field("store", "yes").field("analyzer","ik")
							.endObject()
							.startObject("content")
								.field("type","string").field("store", "yes").field("analyzer","ik")
							.endObject()
							.startObject("comment")
								.field("type","string").field("store", "yes").field("analyzer","ik")
							.endObject()
						.endObject()
					.endObject()
				.endObject();
		PutMappingRequest request = Requests.putMappingRequest("blog1")
				.type("article")
				.source(mappingBuilder);
		client.admin().indices().putMapping(request).get();
		//关闭
		client.close();
	}
	
	
	/**创建文档*/
	@Test
	public void createDocument_boost() throws Exception{
		
		Article article = new Article();
//		article.setId(1);
//		article.setTitle("搜索引擎服务器"); // 有搜索
//		article.setContent("基于restful的数据风格"); // 无搜索
//		article.setComment("我们学习Elasticsearch搜索引擎服务器");// 有搜索
		
		article.setId(2);
		article.setTitle("什么是Elasticsearch"); // 无搜索
		article.setContent("Elasticsearch搜索引擎服务器"); // 有搜索
		article.setComment("Elasticsearch封装了lucene");// 无搜索
		
		ObjectMapper objectMapper = new ObjectMapper();
		String source = objectMapper.writeValueAsString(article);
		System.out.println("source:"+source);
		
		IndexResponse indexResponse = client.prepareIndex("blog1", "article", article.getId().toString()).setSource(source).get();
		// 获取响应的信息
		System.out.println("索引名称:"+indexResponse.getIndex());
		System.out.println("文档类型:"+indexResponse.getType());
		System.out.println("ID:"+indexResponse.getId());
		System.out.println("版本:"+indexResponse.getVersion());
		System.out.println("是否创建成功:"+indexResponse.isCreated());
		client.close();
	}
【测试】
[AppleScript] 纯文本查看 复制代码
@Test
	public void testQueryString_boost() throws Exception{
		SearchResponse searchResponse = client.prepareSearch("blog1").setTypes("article")
				.setQuery(QueryBuilders.queryStringQuery("搜索").field("content^10").field("title^5").field("comment"))
				.get();
		SearchHits hits = searchResponse.getHits();//获取数据的结果集对象,获取命中次数
		// 显示数据
		this.searchValue(hits);
		//关闭
		client.close();
	}
	
	@Test
	public void testBoolQuery_boost() throws Exception{
		SearchResponse searchResponse = client.prepareSearch("blog1").setTypes("article")
				.setQuery(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("title", "搜索").boost(5f))
						.should(QueryBuilders.termQuery("content", "搜索").boost(10f)))
				.get();
		SearchHits hits = searchResponse.getHits();//获取数据的结果集对象,获取命中次数
		// 显示数据
		this.searchValue(hits);
		//关闭
		client.close();
	}
【显示结果】
[AppleScript] 纯文本查看 复制代码
// 显示查询的结果数据
	private void searchValue(SearchHits hits) {
		System.out.println("查询的结果数量有"+hits.getTotalHits()+"条");
		System.out.println("结果中最高分:"+hits.getMaxScore());
		// 遍历每条数据
		Iterator<SearchHit> iterator = hits.iterator();
		while(iterator.hasNext()){
			SearchHit searchHit = iterator.next();
			System.out.println("所有的数据JSON的数据格式:"+searchHit.getSourceAsString());
			System.out.println("每条得分:"+searchHit.getScore());
			// 获取每个字段的数据
			System.out.println("id:"+searchHit.getSource().get("id"));
			System.out.println("title:"+searchHit.getSource().get("title"));
			System.out.println("content:"+searchHit.getSource().get("content"));
			System.out.println("**********************************************");
			for(Iterator<SearchHitField> ite = searchHit.iterator();ite.hasNext();){
				SearchHitField next = ite.next();
				System.out.println(next.getValues());
			}
		}
	}
1.2. 在Field字段的映射中定义加权
可以在映射中添加:
等同于:
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马