【问题标题】:ElasticSearch query with not contains不包含的 ElasticSearch 查询
【发布时间】:2022-01-22 06:59:54
【问题描述】:

我正在编写一个 Java 应用程序并使用弹性搜索作为数据库。

我正在寻找一种编写“不包含”查询的方法。

例如,我有一个带有值的字段类别:

  • 汽车
  • 公交车
  • 火车
  • 快车

现在我想获取所有类别中不包含“快速”的条目。

如何构建这样的查询? 我一直在这附近寻找,但找不到任何东西。

提前致谢

感谢@James 和@Bhavya Gupta,我可以更新我的查询,但它没有按预期工作。

我现在的查询是:

"query": {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must_not": [
                        {
                            "term": {
                                "BetriebsID": "Aufzug"
                            }
                        }   ]
                    }
                }
        }
    }

但结果仍然包含这样的命中:

"hits": [
            "_source": {
                ...
                "FormNo": 9150520000000692,
                "CreatedTime": "2020-05-15T08:19:03.000Z",
                "templateId": "Aufzugsstoerung",
                "SYS_FORM_ID": "150520_000000692",
                "trecId": 151,
                "BetriebsID": "20200515_1019_Aufzugsstoerung",
                "displayName": "Aufzugsstörung",
                ...
            }
            }]

我也尝试了 James 的通配符查询,结果相同。

【问题讨论】:

  • 你有没有机会仔细阅读我的回答,期待得到你的反馈:)
  • 是的,但我不适合我。我更新了我的问题。请看一看。
  • 所以我让查询工作。错误是,BetriebsId 上有一个关键字映射。所以我需要过滤 BetriebsId.keyword。比查询按预期工作

标签: java elasticsearch


【解决方案1】:

也可以按照@James 的建议使用通配符查询,但不建议使用通配符(尤其是在搜索查询的开头),因为它可能会影响性能并减慢搜索速度。

添加一个带有索引映射、搜索查询和搜索结果的工作示例

索引映射:

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "my_tokenizer"
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "ngram",
                    "min_gram": 2,
                    "max_gram": 10,
                    "token_chars": [
                        "letter",
                        "digit"
                    ]
                }
            }
        },
        "max_ngram_diff": 50
    },
    "mappings": {
        "properties": {
            "category": {
                "type": "text",
                "analyzer": "my_analyzer",
                "search_analyzer": "standard"
            }
        }
    }
}

搜索查询:

{
    "query": {
        "bool": {
            "must": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must_not": [
                        {
                            "term": {
                                "category": "fast"
                            }
                        }
                    ]
                }
            }
        }
    }
}

搜索结果:

"hits": [
      {
        "_index": "stof_64009221",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "category": "car"
        }
      },
      {
        "_index": "stof_64009221",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "category": "bus"
        }
      },
      {
        "_index": "stof_64009221",
        "_type": "_doc",
        "_id": "3",
        "_score": 1.0,
        "_source": {
          "category": "train"
        }
      }
    ]

【讨论】:

  • 很抱歉,我将 James 回复标记为解决方案。似乎对于我的实际查询,通配符查询有效,而术语查询无效。但我尝试了不同的方式,因为性能对我来说非常重要
【解决方案2】:

您可以使用带有must_not 的布尔查询。 Kibana 查询如下所示:

GET my_index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "wildcard": {
            "category": {
              "value": "fast*"
            }
          }
        }
      ]
    }
  }
}

示例 Java 代码:

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
                .query(QueryBuilders.boolQuery().mustNot(QueryBuilders.wildcardQuery("category", "fast*")));
        SearchRequest searchRequest = new SearchRequest("index_name");
        searchRequest.source(searchSourceBuilder);
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多