使用 man ascii 来查看 ASCII 表。

ES 查询的关键词为单个汉字时 查询失败

Elasticsearch | 作者 menzhipeng | 发布于2018年10月08日 | 阅读数:7412

系统提示:这个人太懒了,什么问题描述都没有写!

已邀请:

menzhipeng

赞同来自:

如果数据中某字段只有 “方”,则通过关键词 “方”可以查询本条数据。
如果字段中有“方法”二字,则通过关键词“方”  查询不到。

rochy - rochy_he

赞同来自:

应该是分词的效果,方法是一个词语,被分词后是一个单独的 term,也就是搜索的最小单元
如果你希望“方法”在搜索“方”和“法”时都能被搜索到,你可以采用默认的分词器,按字切分
或者你使用通配符匹配搜索等方式
 
你需要了解 Term Level 以及 Text Level 两种搜索的区别
 

elasticStack - 90后it大数据男

赞同来自:

1.es什么版本
2.什么分词器
3.查询的dsl

menzhipeng

赞同来自:

//要匹配的数据字段 
String[] columns = {"articleTitle","articleContent","author"}; 
try { 
SearchResponse searchResponse = null; 
SearchRequestBuilder builder = null; 
//设置查询 
builder = this.transportClient.prepareSearch(index) .setTypes(type) ; 
//设置高亮 HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false); highlightBuilder.preTags("<span class=\"red\">"); highlightBuilder.postTags("</span>"); builder.highlighter(highlightBuilder);
 
 //设置排序 if (!StringUtils.isBlank(searchVo.getSortColumn())) { builder.addSort(searchVo.getSortColumn(), SortOrder.DESC.equals(searchVo.getSort())?SortOrder.DESC:SortOrder.ASC); } 
 
//设置分页 默认第一页 每页十条数据 
if(pager.getPage()==0){ pager.setPage(1); } if(pager.getRows()==0){ pager.setRows(20); } 
builder.setFrom( (pager.getPage()-1)* pager.getRows() ).setSize(pager.getRows()); 
 
//组合查询 //多字段 单key 匹配查询 
QueryBuilder multiMatch = QueryBuilders.multiMatchQuery(key, columns); 
 
//匹配articleType 
QueryBuilder articleType = QueryBuilders.multiMatchQuery(searchVo.getArticleType(),"articleType"); builder.setQuery(QueryBuilders.boolQuery().must(multiMatch).must(articleType)); 
 
//进行查询并响应 searchResponse = builder.get(); if(searchResponse==null) return null; 
// 查询的总数(命中数) for(SearchHit hit:searchResponse.getHits()){ Map<String, Object> source = hit.getSource(); 
//处理高亮片段 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); for(int i=0;i<columns.length;i++){ HighlightField articleTitleField = highlightFields.get(columns[i]); if(articleTitleField!=null){ Text[] fragments = articleTitleField.fragments(); String nameTmp =""; for(Text text:fragments){ nameTmp+=text; }
 //将高亮片段组装到结果中去 source.put(columns[i],nameTmp); } } } return searchResponse.getHits().iterator(); }catch (Exception e){ log.error(e); return null; }
 

要回复问题请先登录注册