Elasticsearch 更喜欢这样的结果

Elasticsearch more like this results

我正在制作一个包含产品的网页。所有产品都在 elasticsearch 索引中,我正在使用 Java.

检索

现在我想把符合日期条件的类似产品放在那里,所以我开始搜索并找到了 "More like this"。所以我所做的是:

FilteredQueryBuilder queryBuilder = new FilteredQueryBuilder(QueryBuilders.matchAllQuery(), FilterBuilders.rangeFilter("finish_date").gt("now"));
SearchSourceBuilder query = SearchSourceBuilder.searchSource().query(queryBuilder);
SearchResponse response = esClient.prepareMoreLikeThis("auction", "product", productId).setSearchSize(size).setField("name").setMinTermFreq(1).setMinWordLen(2).setSearchSource(query).execute().actionGet();

这返回了一些值(但我不知道它是否正确)。所以为了测试我索引了两个产品:

{"_index":"auction","_type":"product","_id":"2","_version":3,"found":true,"_source":
{"name" : "Compro Portátil Asus x552cl-sx150h", "product_suggestions" : {"input":["compro portátil Asus x552clsx033h","compro","portátil","asus", "x552cl-sx033h","asus"]}, "description" : "Compro portátil usado mas com garantia.", "brand" : "Asus","brand_facet" : "Asus",  "state_id" : "2", "user_state_description" : "Used", "product_type_id" : "1", "photos" : [""], "current_price" : 450, "finish_date" : "2014/09/20 17:20"}}

还有

{"_index":"auction","_type":"product","_id":"1000","_version":3,"found":true,"_source":
{"name" : "Compro Portátil Asus x552cl-sx150h", "product_suggestions" : {"input":["compro portátil Asus x552clsx033h","compro","portátil","asus", "x552cl-sx033h","asus"]}, "description" : "Compro portátil usado mas com garantia.", "brand" : "Asus","brand_facet" : "Asus",  "state_id" : "2", "user_state_description" : "Used", "product_type_id" : "1", "photos" : [""], "current_price" : 450, "finish_date" : "2015/09/20 17:20"}}

所以打开 id=2 的产品我期待得到另一个类似的产品(id 1000),但事实并非如此。这是对的,还是我做错了什么?

谢谢

由于您只有少量文档,因此需要将 min_doc_freq 设置为 0。 更像这样把每个term都考虑一下,看看这个词在多少文档中出现过。这称为逆文档频率。现在,如果这个词小于 5(默认情况下),则不考虑该词。这意味着如果你有一个包含少量文档的索引,默认情况下你的 MLT 大多不会工作。因此,将最小文档频率更改为 0 或 1 以使您的代码正常工作。 所以,下面的 java 代码应该可以工作 -

SearchResponse response = esClient.prepareMoreLikeThis("auction", "product", productId)
            .setSearchSize(size)
            .setField("name")
            .setMinDocFreq(0)
            .setMinTermFreq(1)
            .setMinWordLen(2)
            .setSearchSource(query)
            .execute().actionGet();