我正在使用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}
/>
此查询更加混乱,我不知道在检查文档和粗略查看源代码之后要尝试下一步。
(为了简洁起见,我不打算包括这两次尝试创建的错误查询,除非有人认为信息有用。)
答案 0 :(得分:0)
想出来。使用QueryDSL结构并不是很好,但显然你可以使用纯JSON创建查询,这非常有用。基本上更新了我的查询构建器,以便返回:
return {
bool: {
must: [
{
multi_match:{
query: queryString,
type: 'phrase_prefix',
fields: prefixQueryFields,
}
}
],
must_not: [
{
term: {
status: 'archived',
}
}
]
}
};