如何在searchkit中使用SearchBox构建复合查询?

时间:2017-11-02 01:37:04

标签: javascript reactjs elasticsearch searchkit

我正在使用searchkit尝试构建基本的文本搜索。我认为我想构建的查询非常简单。它需要像这样结构:

{  
  "query":{  
    "bool":{  
      "must":[
        {  
          "multi_match":{
            "query":"test search",
            "type":"phrase_prefix",
            "fields":[
              "field_1^5",
              "field_2^4",
              "field_3"
            ]
          }
        },
        {
          "term":
          {
            "field_id": "3"
          }
        }
      ],
      "must_not":[
        {
          "term":
          {
            "status": "archived"
          }
        }
      ]
    }
  },
  "size":6,
  "highlight":{  
    "fields":{  
      "field_1":{},
      "field_2":{},
      "field_3":{}
    }
  }
}

我尝试使用prefixQueryFields属性,这给了我一些非常接近我想要的东西,除了它使用BoolShould而不是BoolMust,而且它总是包括默认的SimpleQueryString查询。它看起来像这样:

const prefixQueryFields = [
  'field_1^5',
  'field_2^4',
  'field_3',
];

...

<SearchBox
  searchOnChange={true}
  prefixQueryFields={prefixQueryFields}
/>

我无法轻易找出问题并决定使用queryBuilder中的SearchBox属性。这就是我想出的:

_queryBuilder(queryString) {
  const prefixQueryFields = [
    'field_1^5',
    'field_2^4',
    'field_3',
  ];
  return new ImmutableQuery()
    .addQuery(BoolMust([
      MultiMatchQuery(queryString, {
        type: 'phase_prefix',
        fields: prefixQueryFields,
      })
    ]))
    .addQuery(BoolMustNot([
      TermQuery('status', 'archived'),
    ]));
}

...

<SearchBox
  searchOnChange={true}
  queryBuilder={this.queryBuilder}
/>

此查询更加混乱,我不知道在检查文档和粗略查看源代码之后要尝试下一步。

(为了简洁起见,我不打算包括这两次尝试创建的错误查询,除非有人认为信息有用。)

1 个答案:

答案 0 :(得分:0)

想出来。使用QueryDSL结构并不是很好,但显然你可以使用纯JSON创建查询,这非常有用。基本上更新了我的查询构建器,以便返回:

return {
  bool: {
    must: [
      {
        multi_match:{
          query: queryString,
          type: 'phrase_prefix',
          fields: prefixQueryFields,
        }
      }
    ],
    must_not: [
      {
        term: {
          status: 'archived',
        }
      }
    ]
  }
};