2015-10-16 2 views
1

Вот мой фрагмент кода для поиска профиля, блога и контента с сайта kademi с помощью API SearchManager из приложения поиска.Как фильтровать результаты поиска по типу индекса в 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.

enter image description here

ответ

0

Там есть несколько изменений, которые вы должны сделать Во-первых, вместо имен индексов непосредственно (например, отруби-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"); 

Затем вы можете выполнить поисковый запрос, используя методы API 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> 

+0

Я не сказал явно, но метод выше позволяет устанавливать типы документов на – brad

Смежные вопросы