Elasticsearch Java API MoreLike与" _search"相比,这不返回文档休息终点

时间:2016-07-28 08:55:59

标签: java elasticsearch morelikethis

意向: Elasticsearch Java MoreLike这个Java查询通过more_like_this休息端点正在执行以下原始/_search过滤查询。

GET /index/type/_search
{
  "query": {
    "filtered": {
      "query": {
        "more_like_this": {
          "fields": [
            "title",
            "body",
            "description",
            "organisations",
            "locations"
          ],
          "min_term_freq": 2,
          "max_query_terms": 25,
          "ids": [
            "http://xxx/doc/doc"
          ]
        }
      },
      "filter": {
        "range": {
          "datePublished": {
            "gte": "2016-01-01T12:30:00+01:00"
          }
        }
      }
    }
  },
  "fields": [
    "title",
    "description",
    "datePublished"
  ]
}

这是我上面的Java实现:

FilteredQueryBuilder queryBuilder = new FilteredQueryBuilder(QueryBuilders.matchAllQuery(),FilterBuilders.rangeFilter("datePublished").gte(("2016-01-01T12:30:00+01:00")));
SearchSourceBuilder query = SearchSourceBuilder.searchSource().query(queryBuilder);
return client.prepareMoreLikeThis("index", "type", "http://xxx/doc/doc")
    .setField("title", "description", "body", "organisations","locations")
    .setMinTermFreq(2)
    .maxQueryTerms(25)
    .setSearchSource(query);

然而,结果与more_like_this休息终点返回的结果大不相同。我在索引中获得了大约4/5的整个文档的匹配。好像没有应用任何过滤器

定位ES v1.4.2v1.6.2

请给我任何建议。谢谢

1 个答案:

答案 0 :(得分:0)

我用QueryBuilders.moreLikeThisQuery()得到了渴望的结果。这篇文章的启示here

 FilterBuilder filterBuilder = FilterBuilders.rangeFilter("datePublished")
        .gte("2016-01-01T12:30:00+01:00")
        .includeLower(false).includeUpper(false);

    MoreLikeThisQueryBuilder mltQueryBuilder = QueryBuilders.moreLikeThisQuery("title", "description", "body", "organisations","locations")
        .minTermFreq(2)
        .maxQueryTerms(25)
        .ids("http://xxx/doc/doc");

    SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index");

    searchRequestBuilder.setTypes("type");
    searchRequestBuilder.addFields("title","description","datePublished");
    searchRequestBuilder.setQuery(mltQueryBuilder).setPostFilter(filterBuilder);

    searchRequestBuilder.execute().actionGet()

注意:

  • QueryBuilders在与ES v2.0和beyound的兼容性方面似乎是前进的方向
  • @MoreLikeThisRequestBuilder将在ES v1.6 +中弃用,并在2.0
  • 中删除