8

我最近开始探索搜索世界,并尝试使用 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"我在查找using时没有问题.setQuery(termQuery("name", "testname")),但"name":"this is a test name"不适用于上面的示例。我究竟做错了什么?

4

3 回答 3

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方法来检索相关数据。

于 2013-01-14T08:26:42.543 回答
0

最好看看 [wildcard Query] ( http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html )

于 2014-07-13T18:55:13.500 回答
0

看起来弹性搜索中的termQuery使用 Lucence 作为搜索语法。根据Lucene 文档,“*”通配符不允许作为搜索的第一个词。

于 2013-01-12T21:51:10.670 回答