Elasticsearch-Java Search没有给出任何结果

时间:2016-01-26 06:31:29

标签: java elasticsearch full-text-search

刚开始使用ElasticSearch和JAVA Client API本身,并尝试使用非常简单的Hello World程序。但是,当我尝试在文档中搜索特定关键字时,我没有得到任何结果。

在这需要一些帮助 -

/venues

PutJsonDocument方法 -

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();

这是将文档放在ES中,因为getDocuments正在给我结果。

然而,搜索文件并不适合我 -

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;
    }

这就是它的名称 -

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");

现在我的目标很简单,我只想在标题字段中搜索关键字“Anurag”并返回相应的文档。有什么建议/指示吗?

BR,

阿努拉格

2 个答案:

答案 0 :(得分:1)

这可能是因为默认情况下您的title字段是analyzed字符串。如果您以小写字母搜索anurag,则会获得匹配。

searchDocument(client, "kodcucom", "article", "title", "anurag");
                                                        ^
                                                        |
                                                use lowercase here

答案 1 :(得分:1)

由于您在同一个JAVA程序上依次运行Elasticsearch索引和搜索API,因此没有足够的时间使用新的索引json文档刷新Elasticsearch索引。

默认情况下,Elasticsearch会每1秒定期调用一次刷新 JAVA代码(如您所知)运行速度比Elasticsearch准备文档进行搜索所花费的时间更快,因此它不会返回您的文档。

解决问题的一种方法是在搜索之前Thread.sleep(2000);(这是一种非常糟糕的做法,但对于学习API会起作用)。

解决问题的另一种方法是在搜索之前使用prepareRefresh()
client.admin().indices().prepareRefresh().get();
其中强制Elasticsearch刷新其索引并为连续搜索请求做好准备。