Elasticsearch похожие документы на Java
Я делаю сайт (аукционный сайт) с использованием Java. У меня есть одна страница, чтобы показать товар на аукционе, и я хочу показать 10 похожих товаров.
Для выполнения поиска я использую эластичный поиск (с помощью 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 ответа
Лучше всего, если у вас неправильный идентификатор, и я также вижу, что вы не указали тип. Чтобы использовать больше, как это, вы должны предоставить документ для использования. Это определяется комбинацией индекса, типа и идентификатора. Если вы не укажете документ правильно,asticsearch не сможет найти документ, и, скорее всего, вы получите сообщение об отсутствии документа.
В 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();
Поэтому, немного потрудившись, я нашел кого-то с той же проблемой. Поэтому он предложил установить 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 правильным значением. Кто-то знает, что это за поле?
Спасибо за помощь!
Еще раз спасибо за помощь и извините за все проблемы!