0

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

为了执行搜索,我使用了 elasticsearch(通过使用 elasticsearch java implementation dadoonet)。

我的一项要求是仅显示 10 个日期 > now 的类似文档。

我说弹性搜索文档,我发现查询“更像这样”,但首先我没有让这个工作使用:

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

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

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

谢谢

4

2 回答 2

2

我最好的选择是您的 id 错误,而且我还看到您缺少类型。要使用更多这样的方式,您必须提供要使用的文档。这是由 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();
于 2015-01-04T08:24:41.080 回答
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 是否是正确的值。有人知道这个领域是什么吗?

感谢所有的帮助!

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

于 2015-01-06T00:45:05.637 回答