0

我正在做一个有产品的网页。所有产品都在弹性搜索索引中,我正在使用 Java 进行检索。

现在我想把尊重日期条件的类似产品放在那里,所以我开始搜索并找到“更多这样的”。所以我所做的是:

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)类似的产品,但事实并非如此。这是对的,还是我做错了什么?

谢谢

4

1 回答 1

3

由于您只有少量文档,因此您需要将 min_doc_freq 设置为 0。更像这样,需要考虑每个术语并查看该词在多少文档中出现。这称为逆文档频率。现在,如果该词小于 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();
于 2015-01-19T08:20:28.640 回答