ElasticSearch使用Java API进行全文搜索

时间:2013-01-12 19:53:58

标签: java lucene elasticsearch

我最近开始探索搜索世界,并尝试使用ES作为MongoDB的索引。我成功地将它们集成在一起,但我发现搜索API相当复杂和令人困惑。 Java API也没有太大帮助。我能找到完全匹配的内容,但如何进行全文搜索?这是我的代码:

Settings settings = ImmutableSettings.settingsBuilder()
    .put("cluster.name", "elasticsearch").build();
Client client = new TransportClient(settings)
    .addTransportAddress(new InetSocketTransportAddress("host-ip", 9300));
SearchResponse response = client.prepareSearch("mongoindex")
    .setSearchType(SearchType.QUERY_AND_FETCH)
    .setQuery(termQuery("name", "*name*"))
    .setFrom(0).setSize(60).setExplain(true)
    .execute()
    .actionGet();

使用"name":"testname"查找.setQuery(termQuery("name", "testname"))没有问题,但"name":"this is a test name"不适用于上述示例。我做错了什么?

3 个答案:

答案 0 :(得分:8)

在网上爬了几个小时之后,我已经设法在javadocs的帮助下弄明白了。最重要的是接口*QueryBuilder*及其实现类。我使用FieldQueryBuilder作为查询,在下面的setQuery方法中显示。

SearchResponse response = client.prepareSearch("mongoindex")
    .setSearchType(SearchType.QUERY_AND_FETCH)
    .setQuery(fieldQuery("name", "test name"))
    .setFrom(0).setSize(60).setExplain(true)
    .execute()
    .actionGet();
SearchHit[] results = response.getHits().getHits();
for (SearchHit hit : results) {
  System.out.println(hit.getId());    //prints out the id of the document
  Map<String,Object> result = hit.getSource();   //the retrieved document
}

使用生成的Map对象,您只需调用get方法即可检索相关数据。

答案 1 :(得分:0)

看起来termQuery in elasticsearch使用了Lucence的搜索语法。根据{{​​3}}&#34; *&#34;不允许使用通配符作为搜索的第一个术语。

答案 2 :(得分:0)