elasticsearch,morelikethis,Java,elasticsearch,Morelikethis" /> elasticsearch,morelikethis,Java,elasticsearch,Morelikethis" />

Elasticsearch在Java中搜索类似文档

Elasticsearch在Java中搜索类似文档,java,elasticsearch,morelikethis,Java,elasticsearch,Morelikethis,我正在用java做一个网站(拍卖网站)。我有一个页面来展示拍卖中的产品,我想展示10个类似的产品 为了执行搜索,我使用了elasticsearch(通过使用ElasticSearchJava实现数据集) 我的一个要求是只显示10个日期>现在的类似文档 我在elasticsearch文档中找到了“更像这样”的查询,但首先,我无法使用: new MoreLikeThisRequest("auction").searchSize(size).id(productId + "").fields(new

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

为了执行搜索,我使用了elasticsearch(通过使用ElasticSearchJava实现数据集)

我的一个要求是只显示10个日期>现在的类似文档

我在elasticsearch文档中找到了“更像这样”的查询,但首先,我无法使用:

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

我的最佳选择是您的id错误,而且我还发现您缺少类型。要像这样使用,您必须提供要使用的文档。这是由索引、类型和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();
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();

所以,经过一点挣扎之后,我发现有人也有同样的问题。所以他的建议是将min_term_freq设置为1

因此,代码现在如下所示:

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();
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是否正确。有人知道这个领域是什么吗

谢谢你的帮助


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

您是如何定义文档的架构的?我的映射查询是(未完成):curl-XPUT”“-d'{“映射”:{“产品”:{“已启用”:true},“属性”:{“名称”:{“类型”:“多字段”,“字段”:{“名称”:{“类型”:“字符串”,“索引分析器”:“nGram分析器”,“搜索分析器”:“空白分析器”}(…)类型是“产品”而不是“字符串”.我已经更改了产品,并使用了Jettro Coenradie建议,错误消失了,但没有返回任何结果。我不知道为什么..所以我将您所说的使用索引“拍卖”作为类型“产品”来更改我所做的操作错误消失了,但什么也没有返回。另一件事是,我没有看到用date