首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在kademi中按索引类型过滤搜索结果?

如何在kademi中按索引类型过滤搜索结果?
EN

Stack Overflow用户
提问于 2015-10-16 13:02:29
回答 1查看 27关注 0票数 1

下面是我使用搜索应用程序的SearchManager API从kademi站点搜索配置文件、博客和内容的代码片段。

代码语言:javascript
复制
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 = profileindex name = profile中获取数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-17 02:10:46

首先,您应该做一些更改,而不是直接命名索引(如bran-103166797),您应该使用AppIndexers,以便生成正确的名称。否则,当您发布网站的新版本时,您的搜索仍将是索引旧版本:

代码语言:javascript
复制
        var sm = applications.search.searchManager;
        var indexers = sm.appIndexers;
        var profileIndexer = indexers.profile;
        var contentIndexer = indexers.content;

然后,您可以在prepareSearch上使用SearchManager方法,它允许您直接操作搜索生成器:

代码语言:javascript
复制
        log.info("using indexers {} {}", profileIndexer, contentIndexer);
        var builder = sm.prepareSearch(profileIndexer, contentIndexer);
        builder.setSource(JSON.stringify(json));
        builder.setTypes("profile", "html");

然后可以使用elasticsearch方法执行搜索查询。注意,在本例中,我使用的是内联js脚本,而不是js控制器,因此我需要在请求属性中设置结果,以便模板能够访问它。

代码语言:javascript
复制
        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

该示例中模板的来源如下:

代码语言:javascript
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33171211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档