Elasticsearch过滤器

时间:2019-01-09 04:55:03

标签: node.js elasticsearch

我将通过节点js从前端接收过滤器输入,其中一些可能为null或为空,但是在elasticsearch查询过滤器中,所有字段均应存在。即使某些过滤器的输入为空,如何获得响应?

 elasticClient.search({
                 index: 'pubmed-index',
                 type: 'pubmed-paper',
                 body: {
                  query: {
                      bool: {
                          must: {
                              match: {
                                  Abstract: `${searchKeyword}`
                              }
                          },
                          filter:
                          {"or":[{
                                  term: 
                                  {
                                  "Publication Type": `${searchPublicationType}`
                                  }},
                              {

                              "range": {
                                "Date Completed": {
                                    "gte" :`${searchGreaterYear}||/y`,
                                    "lte" : `${searchLesserYear}||/y`,
                                    "format" :"yyyy"
                                }
                            }
                          }
                           ]}



                      }
                  }
              }
               }).then(function (resp) {
                   console.log(resp.hits.hits);
                   return res.json(resp.hits.hits)
               }, function (err) {
                   console.log(err.message);
                   return res.json(err.message)
               });

如果缺少任何字段,我需要输出出版物类型或完成日期

1 个答案:

答案 0 :(得分:0)

我建议您看一下Elasticsearch提供的search template功能。

它使用mustache作为模板语言,并允许使用例如条件子句:

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "line": "{{text}}" 
        }
      },
      "filter": {
        {{#line_no}} 
          "range": {
            "line_no": {
              {{#start}} 
                "gte": "{{start}}" 
                {{#end}},{{/end}} 
              {{/start}} 
              {{#end}} 
                "lte": "{{end}}" 
              {{/end}} 
            }
          }
        {{/line_no}} 
      }
    }
  }
}

还有更多选择。

在类似情况下,我在生产中使用了它-当用户未为其添加任何值时,省略一些过滤器。