Elasticsearch在Java中使用类似的文档

时间:2015-01-03 11:24:47

标签: java elasticsearch morelikethis

我正在使用java做一个网站(拍卖网站)。我有一页在拍卖中展示产品,我想展示10种类似的产品。

要使用elasticsearch执行搜索(使用elasticsearch java实现dadoonet)。

我的一个要求是仅显示具有日期>的10个类似文档。现在

我说弹性搜索文档,我找到了查询"更像这样"但首先我不能使用它来实现这个目的:

new MoreLikeThisRequest("auction").searchSize(size).id(productId + "").fields(new String[] { "name", "description", "brand" }).type("string");

因为总是显示错误:

org.elasticsearch.index.engine.DocumentMissingException: [_na][_na] [string][2]: document missing

我找不到过滤日期的方法。

有人可以指出我正确的方法吗?

THKS

2 个答案:

答案 0 :(得分:2)

我最好的选择是你有错误的身份证,我也看到你错过了这种类型。要使用更多这样的东西,您必须提供要使用的文档。这是由index,type和id的组合定义的。如果您没有正确指定文档,则elasticsearch无法找到该文档,这很可能是您收到文档缺失消息的原因。

在java中我会做这样的事情:

FilteredQueryBuilder queryBuilder = 
        new FilteredQueryBuilder(
                QueryBuilders.matchAllQuery(),
                FilterBuilders.rangeFilter("datefield").lte("now")
        );
SearchSourceBuilder query = SearchSourceBuilder.searchSource().query(queryBuilder);

client.prepareMoreLikeThis("index","type","id")
    .setField("field1","field2")
    .setSearchSource(query)
    .execute().actionGet();

答案 1 :(得分:0)

所以经过一段时间的努力,我找到了一个有同样问题的人。所以他的建议是将min_term_freq设置为1。

所以代码现在看起来像这样:

FilteredQueryBuilder queryBuilder = new FilteredQueryBuilder(QueryBuilders.matchAllQuery(), FilterBuilders.rangeFilter("finish_date").lt("now"));
        SearchSourceBuilder query = SearchSourceBuilder.searchSource().query(queryBuilder);
        SearchResponse response = esClient.prepareMoreLikeThis("auction", "product", productId + "").setField("name.name", "description", "brand").setPercentTermsToMatch(0.3f)
                .setMinTermFreq(1).setSearchSource(query).execute().actionGet();

但是我不知道这个MinTermFreq做了什么,如果值1是正确的值。有人知道这个领域是什么?

请求所有帮助!

再次感谢您的帮助,并为所有麻烦抱歉!