在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

请教一个关于es搜索的问题

Elasticsearch | 作者 a2615381 | 发布于2018年11月17日 | 阅读数:3054

我在的公司项目 类似一个电商吧,是做商品中文搜索的
使用的是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才能出现比较合理的搜索结果,避免这些差别太大的搜索结果?
或者各位 有用 中文搜索分词器的朋友,能说下自己配置的经验吗? 万分感谢
 
已邀请:

rochy - rochy_he

赞同来自: tygcs ly365

queryStringQuery 看起来你是使用的类似 _all 的方式进行搜索么?
不管使用何种手法,对于电商这种对精确度有要求的场景,推荐你按照下面的步骤进行:
1.、进行数据建模:理清商品搜索中需要被搜索的对象包含的元素,例如:商品标题、商品描述、商品属性等;
2、 确定字段的重要性:标题肯定比描述重要、商品属性肯定也比描述重要,对于重要的字段在搜索的适合推荐权重高一些;
3、实现搜索:采用 multiMatchQuery 、boolQuery、termsQuery 等各种方式,实现对商品的搜索;
4、根据搜索结果对权重进行微调,亦或是设置 min_score 来对结果进行过滤;或者使用 function_score_query 对评分进行重写优化等。

要回复问题请先登录注册