设置参数 `node.name` 可以自定义 Elasticsearch 节点的名字。 此条 Tips 由 medcl 贡献。

my bool query_string Query condition error(version 7.2)

Elasticsearch | 作者 knownsec | 发布于2019年11月19日 | 阅读数:927

@medcl:

业务背景: 我需要从两个引表中检索内容,并且需要支持和、或排除和其他简单符号。

首先我先用query_string查询语句查询:
```
{
query: {
bool: {
must_not: [
{
term: { available: false },
},
],
must: {
bool: {
should: [
{
query_string: {
fuzzy_transpositions: true,
analyze_wildcard: true,
query: queryString,
allow_leading_wildcard: true,
default_operator: 'OR',
},
},
],
},
},
},
},
highlight: {
order: 'score',
fragment_size: '80',
number_of_fragments: 1,
pre_tags: ['<mark class="highlight_color">'],
post_tags: ['</mark>'],
fields: {
'*': {},
},
},
};
```

这样二个表的数据都可以查询到,但是,如果第一张表里面有nested字段,就查询不到nested里面对象所对应的数据了,于是,我百度了,以下的查询条件:
```
{
query: {
bool: {
must_not: [
{
term: { available: false },
},
],
must: {
bool: {
should: [
{
nested: {
path: 'extend',
query: {
query_string: {
fuzzy_transpositions: true,
analyze_wildcard: true,
query: queryString,
allow_leading_wildcard: true,
default_operator: 'OR',
fields: ['extend.v'],
},
},
},
},
{
nested: {
path: 'account_data',
query: {
query_string: {
fuzzy_transpositions: true,
analyze_wildcard: true,
query: queryString,
allow_leading_wildcard: true,
default_operator: 'OR',
fields: [
'account_data.password',
'account_data.nickName',
'account_data.accountType',
'account_data.account',
'account_data.desc',
],
},
},
},
},
{
query_string: {
fuzzy_transpositions: true,
analyze_wildcard: true,
query: queryString,
allow_leading_wildcard: true,
default_operator: 'OR',
},
},
],
},
},
},
},
highlight: {
order: 'score',
fragment_size: '80',
number_of_fragments: 1,
pre_tags: ['<mark class="highlight_color">'],
post_tags: ['</mark>'],
fields: {
'*': {},
},
},
}
```

利用以上的查询条件可以达到nested 里面对象的数据可以检索到,但是,好景不长,如果第一张表的数据有nested字段,可以检索到,但是第二张表的数据就检索不到,并且报错,而且是查询条件错误。以下是我的报错信息。

```
{
"took": 71,
"timed_out": false,
"_shards": {
"total": 10,
"successful": 5,
"skipped": 0,
"failed": 5,
"failures": [
{
"shard": 0,
"index": "suspect_table",
"node": "Ms5RKmmORAS69eT-QTvFcQ",
"reason": {
"type": "query_shard_exception",
"reason": "failed to create query: {\n \"bool\" : {\n \"must\" : [\n {\n \"bool\" : {\n \"should\" : [\n {\n \"nested\" : {\n \"query\" : {\n \"query_string\" : {\n \"query\" : \"'exe'\",\n \"fields\" : [\n \"extend.v^1.0\"\n ],\n \"type\" : \"best_fields\",\n \"default_operator\" : \"or\",\n \"max_determinized_states\" : 10000,\n \"allow_leading_wildcard\" : true,\n \"enable_position_increments\" : true,\n \"fuzziness\" : \"AUTO\",\n \"fuzzy_prefix_length\" : 0,\n \"fuzzy_max_expansions\" : 50,\n \"phrase_slop\" : 0,\n \"analyze_wildcard\" : true,\n \"escape\" : false,\n \"auto_generate_synonyms_phrase_query\" : true,\n \"fuzzy_transpositions\" : true,\n \"boost\" : 1.0\n }\n },\n \"path\" : \"extend\",\n \"ignore_unmapped\" : false,\n \"score_mode\" : \"avg\",\n \"boost\" : 1.0\n }\n },\n {\n \"nested\" : {\n \"query\" : {\n \"query_string\" : {\n \"query\" : \"'exe'\",\n \"fields\" : [\n \"account_data.account^1.0\",\n \"account_data.accountType^1.0\",\n \"account_data.desc^1.0\",\n \"account_data.nickName^1.0\",\n \"account_data.password^1.0\"\n ],\n \"type\" : \"best_fields\",\n \"default_operator\" : \"or\",\n \"max_determinized_states\" : 10000,\n \"allow_leading_wildcard\" : true,\n \"enable_position_increments\" : true,\n \"fuzziness\" : \"AUTO\",\n \"fuzzy_prefix_length\" : 0,\n \"fuzzy_max_expansions\" : 50,\n \"phrase_slop\" : 0,\n \"analyze_wildcard\" : true,\n \"escape\" : false,\n \"auto_generate_synonyms_phrase_query\" : true,\n \"fuzzy_transpositions\" : true,\n \"boost\" : 1.0\n }\n },\n \"path\" : \"account_data\",\n \"ignore_unmapped\" : false,\n \"score_mode\" : \"avg\",\n \"boost\" : 1.0\n }\n },\n {\n \"query_string\" : {\n \"query\" : \"'exe'\",\n \"fields\" : [ ],\n \"type\" : \"best_fields\",\n \"default_operator\" : \"or\",\n \"max_determinized_states\" : 10000,\n \"allow_leading_wildcard\" : true,\n \"enable_position_increments\" : true,\n \"fuzziness\" : \"AUTO\",\n \"fuzzy_prefix_length\" : 0,\n \"fuzzy_max_expansions\" : 50,\n \"phrase_slop\" : 0,\n \"analyze_wildcard\" : true,\n \"escape\" : false,\n \"auto_generate_synonyms_phrase_query\" : true,\n \"fuzzy_transpositions\" : true,\n \"boost\" : 1.0\n }\n }\n ],\n \"adjust_pure_negative\" : true,\n \"boost\" : 1.0\n }\n }\n ],\n \"must_not\" : [\n {\n \"term\" : {\n \"available\" : {\n \"value\" : false,\n \"boost\" : 1.0\n }\n }\n }\n ],\n \"adjust_pure_negative\" : true,\n \"boost\" : 1.0\n }\n}",
"index_uuid": "40pL0rfHTI-Dxa8VYqAj9g",
"index": "suspect_table",
"caused_by": {
"type": "illegal_state_exception",
"reason": "[nested] failed to find nested object under path [extend]"
}
}
}
]
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits":
}
}
```

期望: 我有二个表,利用query_string 查询语句可以全文检索出任何一张表的内容,并且每个表里面有nested字段类型(数组对象),也可以检索到。


谢谢!@medcl 各位大神!
已邀请:

Yanchao Ma - 耶和华靠近伤心的人,拯救灵性痛悔的人

赞同来自:

你这个排版看起来很难受,建议调整一下~

要回复问题请先登录注册