elasticsearch 问题请教

2019-02-26 17:22:41 +08:00
 reid2017

最近在搞公司的全文搜索服务,本地搭建了 es 环境,做了些简单的测试,发现些问题。

es version: 6.5.1 中文分词器: ik_smart

在搜索的时候发现两个问题:

  1. 使用 Java api 搜索, 返回的 SearchHit 里面的 _score 全部是 0.0
  2. 搜索同一个关键词, 不添加额外排序规则, 只使用默认排序, Java api 和 http api 返回的数据顺序不一致

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 经验的朋友指点一下?

2846 次点击
所在节点    Elasticsearch
10 条回复
reid2017
2019-02-26 18:27:42 +08:00
110+ 浏览,无人回复啊。。
rogwan
2019-02-26 18:33:41 +08:00
这里看不出 JAVA 指定了分词器,你全部使用默认分词器搜一下,看看两个 API 返回的排序是不是一样?
reid2017
2019-02-26 18:53:22 +08:00
@rogwan 查询的时候要指定分词器的吗?不是建索引时指定就行了吗?
rogwan
2019-02-26 19:05:51 +08:00
分词器有个执行顺序,你建索引指定了,查询的时候没有指定,就走用默认分词器了。
springmarker
2019-02-26 19:18:12 +08:00
先用 json 查,再用 java 写
scf0920
2019-02-26 20:55:42 +08:00
第一个问题,应该用 query,不是 filter。可以搜下这两者的区别。第二个问题,你可以看下 java api 最终也是转化成 http api 发送的,你可以看下转化之后跟你直接用的 http api 的请求 body 是否是一样的
reid2017
2019-02-26 21:55:19 +08:00
@scf0920 谢谢,一言点醒
kiddingU
2019-02-27 10:32:59 +08:00
可以先写 DSL 查一下是不是正确的,然后 API 看是不是生成的最终 DSL 一致
reid2017
2019-02-27 10:57:44 +08:00
@kiddingU 谢谢了,6 楼正解,用错了 filter 导致返回没分数,进而导致排序不一致。
lyc1116
2019-02-28 17:35:01 +08:00
fq 不参与排序

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/538958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX