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 правильным значением. Кто-то знает, что это за поле?

Спасибо за помощь!

Еще раз спасибо за помощь и извините за все проблемы!

Другие вопросы по тегам