英文:
ElasticSearch query with not contains
问题
我正在编写一个Java应用程序,使用Elasticsearch作为数据库。
我正在寻找一种编写“不包含”查询的方法。
例如,我有一个带有以下值的类别字段:
- 车
- 公共汽车
- 火车
- 快车
现在我想获取所有不在类别中包含“fast”的条目。
我应该如何构建这样的查询?
我已经在这里四处寻找,但找不到任何信息。
提前致谢
所以感谢@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提供的通配符查询,但结果相同。
英文:
I'm writing a Java application and use elastic search as database.
I'm looking for a way to write a "not-contains" query.
For Example I've got a field category with values:
- Car
- Bus
- Train
- Fastcar
Now I want to get all entries which not contains "fast" in their category.
How can I build a query like this?
I have been looking around here but can't find anything.
Thanks in advance
So thanks to @James and @Bhavya Gupta I could update my query but it doesn't work as expected.
My query now is:
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"bool": {
"must_not": [
{
"term": {
"BetriebsID": "Aufzug"
}
} ]
}
}
}
}
But the result still contains hits like this:
"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",
...
}
}]
I also tried it with the wildcard query from James, with the same result.
答案1
得分: 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);
英文:
You can make use of Boolean Queries with must_not
for the same. Kibana query would look like:
GET my_index/_search
{
"query": {
"bool": {
"must_not": [
{
"wildcard": {
"category": {
"value": "fast*"
}
}
}
]
}
}
}
Sample Java Code:
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);
答案2
得分: 2
通配符查询也可以像@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"
}
}
]
英文:
Wildcard queries can also be used as suggested by @James, but it is not recommended to use Wildcard (especially at the beginning of search query), as it may affect the performance and slow down the search.
Adding a working example with index mapping, search query, and search result
Index Mapping:
{
"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"
}
}
}
}
Search Query:
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"bool": {
"must_not": [
{
"term": {
"category": "fast"
}
}
]
}
}
}
}
}
Search Result:
"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"
}
}
]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论