最近在搞公司的全文搜索服务,本地搭建了 es 环境,做了些简单的测试,发现些问题。
es version: 6.5.1 中文分词器: ik_smart
在搜索的时候发现两个问题:
Java 代码大致如下:
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.filter(QueryBuilders.matchQuery("content", "我们"));
SearchRequestBuilder requestBuilder = esClient.prepareSearch(INDEX_NAME)
.setTypes(INDEX_TYPE)
.setQuery(query);
SearchResponse response = requestBuilder.get();
response.getHits().forEach(hit -> System.out.println(hit.getScore() + " -> " + hit.getSourceAsString()));
希望有 es 经验的朋友指点一下?
1
reid2017 OP 110+ 浏览,无人回复啊。。
|
2
rogwan 2019-02-26 18:33:41 +08:00 via Android
这里看不出 JAVA 指定了分词器,你全部使用默认分词器搜一下,看看两个 API 返回的排序是不是一样?
|
4
rogwan 2019-02-26 19:05:51 +08:00 via Android
分词器有个执行顺序,你建索引指定了,查询的时候没有指定,就走用默认分词器了。
|
5
springmarker 2019-02-26 19:18:12 +08:00 via Android
先用 json 查,再用 java 写
|
6
scf0920 2019-02-26 20:55:42 +08:00 1
第一个问题,应该用 query,不是 filter。可以搜下这两者的区别。第二个问题,你可以看下 java api 最终也是转化成 http api 发送的,你可以看下转化之后跟你直接用的 http api 的请求 body 是否是一样的
|
8
kiddingU 2019-02-27 10:32:59 +08:00
可以先写 DSL 查一下是不是正确的,然后 API 看是不是生成的最终 DSL 一致
|
10
lyc1116 2019-02-28 17:35:01 +08:00
fq 不参与排序
|