Elasticsearch-Java Search не дает никаких результатов

java elasticsearch full-text-search

561 просмотра

2 ответа

Я только что начал с ElasticSearch и JAVA Client API сегодня и попробовал очень простую программу Hello World. Однако, когда я пытаюсь найти документ по определенному ключевому слову, я не получаю никаких результатов.

Нужна помощь здесь -

Node node = nodeBuilder().clusterName("elasticsearch").node();
Client client = node.client();
client.prepareIndex("kodcucom", "article", "1")
                .setSource(putJsonDocument("Anurag",
                        "ElasticSeach provides Java API, thus it executes all operations "
                                + "asynchronously by using client object..",
                        new Date(), new String[] { "elasticsearch" }, "Anurag Jain"))
                .execute().actionGet();

client.prepareIndex("kodcucom", "article", "2")
                .setSource(putJsonDocument("Java Web Application and ElasticSearch (Video)",
                        "Today, here I am for exemplifying the usage of ElasticSearch which is an open source, distributed "
                                + "and scalable full text search engine and a data analysis tool in a Java web application.",
                        new Date(), new String[] { "elasticsearch" }, "Saanchi Jain"))
                .execute().actionGet();

Метод PutJsonDocument -

public static Map<String, Object> putJsonDocument(String title, String content, Date postDate, String[] tags,
            String author) {

        Map<String, Object> jsonDocument = new HashMap<String, Object>();

        jsonDocument.put("title", title);
        jsonDocument.put("content", content);
        jsonDocument.put("postDate", postDate);
        jsonDocument.put("tags", tags);
        jsonDocument.put("author", author);

        return jsonDocument;
    }

Это помещает документы в ES, поскольку getDocuments дает мне результаты.

Однако поиск документов не работает для меня -

public static void searchDocument(Client client, String index, String type, String field, String value) {

        SearchResponse response = client.prepareSearch(index)
                .setTypes(type)
                .setSearchType(SearchType.DEFAULT)
                .setQuery(QueryBuilders.termQuery(field, value))
                .setFrom(0).setSize(60)
                .setExplain(true)
                .execute()
                .actionGet();

        SearchHit[] results = response.getHits().getHits();

        System.out.println("Current results: " + results.length);
        for (SearchHit hit : results) {
            System.out.println("------------------------------");
            Map<String, Object> result = hit.getSource();
            System.out.println(result);
        }
    }

Вот как это называется -

searchDocument(client, "kodcucom", "article", "title", "Anurag");

Выход -

Current results: 0

Теперь моя цель проста, что я просто хочу найти в поле заголовка ключевое слово «Anurag» и вернуть соответствующий документ. Любой совет / указатели?

BR,

Анураг

Автор: AJ84 Источник Размещён: 16.10.2019 11:36

Ответы (2)


1 плюс

Решение

Это, вероятно, потому что ваше titleполе analyzedпо умолчанию является строкой. Если вы ищете anuragв нижнем регистре, вы получите совпадение.

searchDocument(client, "kodcucom", "article", "title", "anurag");
                                                        ^
                                                        |
                                                use lowercase here
Автор: Val Размещён: 26.01.2016 06:36

1 плюс

Поскольку вы выполняете Elasticsearchиндексирование и поиск API в одной и той же программе JAVA последовательно, у вас недостаточно времени для Elasticsearchобновления индекса новым индексированным документом json.

По умолчанию Elasticsearchбудет вызывать обновление периодически каждую 1 секунду.
Код JAVA (как вы знаете) выполняется быстрее, чем время, необходимое Elasticsearchдля подготовки документа к поиску, и поэтому он не вернул ваш документ.

Один из способов решения этой проблемы - Thread.sleep(2000);поиск (это очень плохая практика, но для изучения API это будет работать).

Другой способ решить эту проблему - использовать prepareRefresh()перед поиском:
client.admin().indices().prepareRefresh().get();
который заставляет Elasticsearchобновлять свои индексы и быть готовым к последовательным поисковым запросам.

Автор: Eyal.Dahari Размещён: 27.01.2016 01:25
Вопросы из категории :
32x32