我在的公司项目 类似一个电商吧,是做商品中文搜索的
使用的是ansj分词器,在设置mapping的时候为中文设置为这样
"objectName": {
"type": "text",
"analyzer": "index_ansj",
"search_analyzer": "query_ansj"
},
其他方面没有做什么配置了,
查询使用的客户端是jestclient,用起来还挺方便,查询也没有过多要求,就是中文模糊查找,
写的代码是这样
SearchResult searchResult = null;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.queryStringQuery(es.getHandleStr()));
searchSourceBuilder.query(boolQuery);
searchResult = searchFromElas(js, es.getEsIndex(), es.getEsType(), searchSourceBuilder.toString());
但是查询结果 很不尽人意,
比如搜索 床头柜,出现床头灯,
搜索 舒适的椅子,出现 钢铁是怎样炼成的
以及搜索 桌子,出现 西门子,
还有搜索词比较怪的时候,希望不要出现结果,但是还是会出现很多结果,而且也和搜索词无关
请问该怎样配置es才能出现比较合理的搜索结果,避免这些差别太大的搜索结果?
或者各位 有用 中文搜索分词器的朋友,能说下自己配置的经验吗? 万分感谢
使用的是ansj分词器,在设置mapping的时候为中文设置为这样
"objectName": {
"type": "text",
"analyzer": "index_ansj",
"search_analyzer": "query_ansj"
},
其他方面没有做什么配置了,
查询使用的客户端是jestclient,用起来还挺方便,查询也没有过多要求,就是中文模糊查找,
写的代码是这样
SearchResult searchResult = null;
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.queryStringQuery(es.getHandleStr()));
searchSourceBuilder.query(boolQuery);
searchResult = searchFromElas(js, es.getEsIndex(), es.getEsType(), searchSourceBuilder.toString());
但是查询结果 很不尽人意,
比如搜索 床头柜,出现床头灯,
搜索 舒适的椅子,出现 钢铁是怎样炼成的
以及搜索 桌子,出现 西门子,
还有搜索词比较怪的时候,希望不要出现结果,但是还是会出现很多结果,而且也和搜索词无关
请问该怎样配置es才能出现比较合理的搜索结果,避免这些差别太大的搜索结果?
或者各位 有用 中文搜索分词器的朋友,能说下自己配置的经验吗? 万分感谢
1 个回复
rochy - rochy_he
赞同来自: tygcs 、ly365
不管使用何种手法,对于电商这种对精确度有要求的场景,推荐你按照下面的步骤进行:
1.、进行数据建模:理清商品搜索中需要被搜索的对象包含的元素,例如:商品标题、商品描述、商品属性等;
2、 确定字段的重要性:标题肯定比描述重要、商品属性肯定也比描述重要,对于重要的字段在搜索的适合推荐权重高一些;
3、实现搜索:采用 multiMatchQuery 、boolQuery、termsQuery 等各种方式,实现对商品的搜索;
4、根据搜索结果对权重进行微调,亦或是设置 min_score 来对结果进行过滤;或者使用 function_score_query 对评分进行重写优化等。