2015-01-03 4 views
0

Я делаю сайт (сайт аукциона) с помощью java. У меня есть одна страница для показа продукта на аукционе, и я хочу показать 10 похожих продуктов.Elasticsearch аналогичные документы в Java

Для выполнения поиска я использую elasticsearch (используя реализацию elasticsearch java dadoonet).

Единственное требование, которое у меня есть, - показать только 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

+0

Как вы определили схему своего документа? – Zouzias

+0

Мой отображение запроса (не полный): завиток -XPUT "HTTP: // локальный: 9200/аукцион" -d» { "отображения": { "товар": { \t "_source": {» включено»: истинно}, "свойства": { "имя": { \t \t \t "типа": "multi_field", \t \t \t "полей": { "имя": { "тип": "строка", \t \t \t "index_analyzer": "nGram_analyzer", \t \t \t \t \t \t "search_analyzer": "whitespace_analyzer" } (...) – amachado

+0

Тип «продукт» не «строка». – Zouzias

ответ

2

Моя лучшая ставка будет то, что у вас есть неправильный идентификатор, и я также вижу, что вам не хватает типа. Чтобы больше использовать это, вы должны предоставить документ для использования. Это определяется комбинацией индекса, типа и 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(); 
+0

Поэтому я изменяю то, что я сделал для того, что вы говорите, используя в качестве индекса «аукцион» как тип «продукт», и ошибка ушла, но ничего не возвращается. Другое дело, что я не вижу способа исключить результаты с датой amachado

+0

Я изменил свой ответ, теперь код содержит пример, чтобы добавить запрос с фильтром для фильтрации по всему документу до этого момента. Тот факт, что вы не получите никаких результатов, трудно объяснить мне. Тогда у меня должен быть хороший пример с некоторыми данными. –

+0

Проблема, что я думаю, что это будет так, как я сделал сопоставление (в комментарии к вопросу) ... возможно, это не способ сделать это больше. – amachado

0

Таким образом, после strugling немного я нашел кого-то с той же проблемой. Таким образом, его предложение было установить 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 является правильным значением. Кто-то знает, что это за поле?

Thks for the help!

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

Смежные вопросы