gpt4 book ai didi

elasticsearch - Elasticsearch -有没有一种方法可以强制文档中可能符合 “must_not”标准的结果?

转载 作者:行者123 更新时间:2023-12-03 01:25:12 27 4
gpt4 key购买 nike

我们运行大量的文章数据集。我们根据某些关键字,过滤器,范围等进行搜索。我们的查询包含MUST/SHOULD/MUST_NOT/FILTER结构。

我们需要能够强制某些结果显示与MUST_NOT条件匹配的结果。

有没有一种方法可以将文档ID强制插入到查询中,从而胜过/覆盖MUST_NOT子句?还是 flex 搜索中MUST_NOT为王。

我们已经尝试在每个MUST/SHOULD中使用嵌套的 bool(boolean) 查询来强制将文档ID放入结果中,但没有执行任何操作。下面的示例在SHOULD块中具有它。

我们尝试将文档ID强制进入MUST块,没有更多的match_phrase等,但是MUST_NOT条件仍然胜过MUST,并且没有返回结果。

这是查询的示例。为了简单起见,我删除了聚合。

{
"query": {
"bool": {
"must": [
{
"bool": {
"must": [],
"should": [
{
"multi_match": {
"query": "Italy",
"fields": [
"title",
"content^2",
"tags"
],
"analyzer": "standard",
"boost": 1
}
},
{
"query_string": {
"fields": [
"tags"
],
"query": "*Italy*",
"default_operator": "AND",
"minimum_should_match": 1
}
}
]
}
}
],
"should": [
{
"multi_match": {
"query": "Serie A",
"fields": [
"title",
"content^2",
"tags"
],
"type": "phrase",
"boost": 4
}
},
{
"multi_match": {
"query": "football",
"fields": [
"title",
"content^2",
"tags"
],
"boost": 3
}
},
{
"terms": {
"_id": [
"5.4416039680717e+23"
]
}
}
],
"must_not": [
{
"match_phrase": {
"content": "Cristiano Ronaldo"
}
},
{
"match": {
"source.feed.editorialTopics": "AmericanFootball"
}
}
],
"minimum_should_match": 1,
"boost": 1
}
},
"from": 0,
"size": 20
}

在这种情况下,我们正在寻找引用意大利意甲的文件,但排除了内容中包括 Cristiano Ronaldo的所有文件,除了一个文件ID: 5.4416039680717e+23,即使该文件确实包含 Cristiano Ronaldo,也必须包括该文件。

结果永远不会返回该文档ID。

我们做错了什么?还是没有办法在Elastic Search中做到这一点?

最佳答案

为了不干扰您当前的查询逻辑,最简单的方法是使用should子句包装所有内容。像这样

{
"query": {
"bool": {
"should": [
{ // --> your current query
"bool": {
"must": [
{
"bool": {
"should": [
{
"multi_match": {
"query": "Italy",
"fields": [
"title",
"content^2",
"tags"
],
"analyzer": "standard",
"boost": 1
}
},
{
"query_string": {
"fields": [
"tags"
],
"query": "*Italy*",
"default_operator": "AND",
"minimum_should_match": 1
}
}
]
}
}
],
"should": [
{
"multi_match": {
"query": "Serie A",
"fields": [
"title",
"content^2",
"tags"
],
"type": "phrase",
"boost": 4
}
},
{
"multi_match": {
"query": "football",
"fields": [
"title",
"content^2",
"tags"
],
"boost": 3
}
},
{
"terms": {
"_id": [
"5.4416039680717e+23"
]
}
}
],
"must_not": [
{
"match_phrase": {
"content": "Cristiano Ronaldo"
}
},
{
"match": {
"source.feed.editorialTopics": "AmericanFootball"
}
}
],
"minimum_should_match": 1,
"boost": 1
}
},
{ // --> the extra logic (else)
"must": {
"match_phrase": {
"content": "Cristiano Ronaldo"
}
}
}
]
}
},
"from": 0,
"size": 20
}

基本上,如果您有一个充满逻辑的查询,并且想说: bring me the results that match either this big query or this smaller one。默认情况下,最小匹配项应为1(如果不存在其他任何项,则必须为must_not)。

关于elasticsearch - Elasticsearch -有没有一种方法可以强制文档中可能符合 “must_not”标准的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com