2014-10-28 184 views
0

我尝试使用ES的搜索模板来执行条件子句here。我正在将我的请求发送到/ [my_index]/_ search/template端点。由于JSON解析问题,请求失败,这很有意义,因为在添加条件子句之后,负载不再是有效的JSON。我应该如何使用搜索模板?是否有非JSON模板的指定端点?Elasticsearch搜索模板

+0

您是否尝试将模板存储为'config/scripts'目录中的文件?参见[文档中的预先注册的模板](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-template.html#_pre_registered_template)。 – Thorsten 2014-10-28 19:11:56

回答

0

您需要在包装字符串中转义模板。

从你引用的同一链接:

正如上面写的,这个模板是不是有效的JSON,因为它包括 部分标记像{{#line_no}}。为此,模板 要么被存储在一个文件中(参见称为 节“预注册templateedit”)通过REST API一起使用时,或者,应该 写成一个字符串:

“模板“:{\”query \“:{\”filtered \“:{\”query \“:{\”match \“:{\”line \“:\”{{text}} \“}}” ,\ “过滤器\”:{{{#LINE_NO}} \ “范围\”:{\ “LINE_NO \”:{{{#开始}} \ “GTE \”:\ “{{开始}} \”{ {#END}},{{/结束}} {{/启动}} {{#结束}} \ “LTE \”:\ “{{端}} \”{{/结束}}}} {{/ “

2

当使用条件子句时,模板将不是有效的JSON,因为它将包含段标记{{#像这样}}。原因,模板应该存储在一个文件中,或者当通过REST API使用时,应该写成一个字符串。

方法1:存储在一个文件

  1. 保存模板的配置/脚本的查询部分

    ES安装>配置>脚本

    test_template tempalte。小胡子

    { 
        "query":{ whatever query } 
    } 
    
  2. 您可以通过此方法通过使用感保存的模板

    GET /_search/template 
    { 
        "template": "test_template", 
        "params": { 
         whatever params 
        } 
    } 
    

方法2:模板作为字符串写入

  1. 模板转换为字符串形式和通过休息api使用

    POST/_search/template/test_template { “template”:“{\”query \“:{whatever query;记得逃脱引号}} “ }

  2. 要搜索使用这个模板,

    GET/_search /模板 { ”模板“:{ ”ID“: ”test_template“ }, ” PARAMS“:{ 任何PARAMS }}

参考:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-template.html#_conditional_clauses