我最近开始探索搜索世界,并尝试使用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"
不适用于上述示例。我做错了什么?
答案 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)