下面是我使用搜索应用程序的SearchManager API从kademi站点搜索配置文件、博客和内容的代码片段。
keyword = params['q'];
var json = {
"query": {
"match": {"_all":keyword}
},
"highlight": {
"fields" : {
"*" : {},
"content" : {
"type" : "plain"
}
}
}
};
var indexes = ["profile", "bran-103166797", "blogs-103166797"]; // profile, content, blog
var sm = applications.search.searchManager;
var result = sm.search(JSON.stringify(json), indexes);如果您在下面看到我的屏幕截图,有几种索引类型用于索引名称=配置文件。我只想从index type = profile和index name = profile中获取数据。

发布于 2015-10-17 02:10:46
首先,您应该做一些更改,而不是直接命名索引(如bran-103166797),您应该使用AppIndexers,以便生成正确的名称。否则,当您发布网站的新版本时,您的搜索仍将是索引旧版本:
var sm = applications.search.searchManager;
var indexers = sm.appIndexers;
var profileIndexer = indexers.profile;
var contentIndexer = indexers.content;然后,您可以在prepareSearch上使用SearchManager方法,它允许您直接操作搜索生成器:
log.info("using indexers {} {}", profileIndexer, contentIndexer);
var builder = sm.prepareSearch(profileIndexer, contentIndexer);
builder.setSource(JSON.stringify(json));
builder.setTypes("profile", "html");然后可以使用elasticsearch方法执行搜索查询。注意,在本例中,我使用的是内联js脚本,而不是js控制器,因此我需要在请求属性中设置结果,以便模板能够访问它。
var result = builder.execute().actionGet();
log.info("result {}", result);
http.request.attributes.result = result; 下面是一个完整的示例:http://docs.kademi.co/howtos/devs/advanced-search-pages-with-the-searchmanager-api.html
该示例中模板的来源如下:
<html>
<head>
<title>search page</title>
</head>
<body>
#script()
<script>
var keyword = http.request.params.q;
var json = {
"query": {
"match": {"_all":keyword}
},
"fields" : ["nickName", "title"],
"highlight": {
"fields" : {
"*" : {},
"content" : {
"type" : "plain"
}
}
}
};
var sm = applications.search.searchManager;
var indexers = sm.appIndexers;
var profileIndexer = indexers.profile;
var contentIndexer = indexers.content;
log.info("using indexers {} {}", profileIndexer, contentIndexer);
var builder = sm.prepareSearch(profileIndexer, contentIndexer);
builder.setSource(JSON.stringify(json));
builder.setTypes("profile", "html");
var result = builder.execute().actionGet();
log.info("result {}", result);
http.request.attributes.result = result; // make available to templating
</script>
#end
<div class="container">
<h1>Search</h1>
<p class="pull-right lead">Showing $request.attributes.result.hits.hits.size() of $request.attributes.result.hits.totalHits hits</p>
<table class="table table-striped">
#foreach( $hit in $request.attributes.result.hits)
<tr>
<td>
$!hit.fields.nickName.value $!hit.fields.title.value
</td>
<td>$hit.type</td>
</tr>
#end
</table>
</div>
<!-- for debugging, just display the search result as json -->
<pre>$request.attributes.result</pre>
</body>
https://stackoverflow.com/questions/33171211
复制相似问题