当前位置: 首页 > 知识库问答 >
问题:

如何在弹性搜索中使用must with或condition中的多个匹配短语?

步博涉
2023-03-14
GET questiondetails/question/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "tags.keyword": "azure-data"
          }
        },
        {
          "match_phrase": {
            "body": "azure-data"
          }
        },
        {
          "match_phrase": {
            "title": "azure-data"
          }
        },
        {
          "match_phrase": {
            "answers.body": "azure-data"
          }
        }
      ],
      "minimum_should_match": 1,
      "filter": {
        "range": {
          "creation_date": {
            "gte": 1584748800,
            "lte": 1585612800
          }
        }
      }
    }
  },
  "size": "10000"
}

添加注释

获取questiondetails_new/question/_search{“query”:{“bool”:{“should”:[{“match_prace”:{“tags.keyword”:“azure-data-factory”}},{“match_prach”:{“title”:“azure-data-factory”}}],“minimum_should_match”:1,“filter”:{“range”:{“creation_date”:{“gte”:1585170170,“lte”:1585170180}}}

在这个查询中,我需要所有与azure-data-factory完全匹配的文档,或者在titile(String)中有azure-data-factory的文档。应该是一个或搜索。但它与值为azure-data-factory-2的标记的匹配也是

共有1个答案

庾奇思
2023-03-14

添加一个char过滤器,在索引时将“-”替换为“_”。您不需要更改输入文本(它将与“-”一起工作)

PUT index38
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",
          "mappings": [
            "- => _"
          ]
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ],
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
      "properties": {
        "tags": {
          "type": "text",
          "analyzer": "my_analyzer",
          "fields": {
            "keyword":{
              "type":"keyword"
            }
          }
        },
        "title": {
          "type": "text",
          "analyzer": "my_analyzer",
          "fields": {
            "keyword":{
              "type":"keyword"
            }
          }
        }
      }
    }
}

查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "tags": "azure-data-factory"
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "match_phrase": {
                  "tags": "azure-data-factory"
                }
              }
            ],
            "should": [
              {
                "match_phrase": {
                  "body": "azure-data-factory"
                }
              },
              {
                "match_phrase": {
                  "title": "azure-data-factory"
                }
              },
              {
                "match_phrase": {
                  "answers.body": "azure-data-factory"
                }
              }
            ]
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "size": "100"
}

如果使用默认分析器分析文本“azure-data-factory”,它将生成3个标记[“azure”,“data”,“factory”]

GET index38/_analyze
{
  "text": "azure-data-factory"
}

Result:

"tokens" : [
    {
      "token" : "azure",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "data",
      "start_offset" : 6,
      "end_offset" : 10,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "factory",
      "start_offset" : 11,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]

GET index38/_analyze
{
  "text": "azure-data-factory",
  "analyzer": "my_analyzer"
}

Result:

"tokens" : [
    {
      "token" : "azure_data_factory",
      "start_offset" : 0,
      "end_offset" : 18,
      "type" : "<ALPHANUM>",
      "position" : 0
    }
]

 类似资料:
  • 我不知道如何通过MatchPhrasePrefix搜索索引中的文档。我想匹配整个搜索词短语,但允许在最后一个词上加前缀。 这个LINQ建筑给了我1.0分的一切。我将如何构建这个?另一方面,是否可以查看NEST正在构建的原始查询?那将非常有帮助!

  • 我有一段说 我对代码的看法: 这是正确的做法吗??

  • 我希望与字段中的字符串完全匹配,然后返回一天,提取所有此类记录。我所使用的json似乎也与简单的单词相匹配。我不确定我哪里出了问题。我需要向这个查询JSON添加吗?我目前拥有的JSON如下所示:

  • 我在这里遵循这个例子: https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html 以下查询: 与预期的一条记录匹配。假设我只想返回用户为“约翰·史密斯”和“艾利斯·怀特”的文档。 我试过: 但这返回零结果。我如何获得同时包含“Alice White”和“John Smith”的文档(这应该只是在原始结果中

  • 问题内容: 我必须找到具有字符串的匹配文档,例如:在某些“键”范围内的字符串:“ sky”。当我编写单独的匹配和范围查询时,我从ES获得输出,但是合并在一起时会抛出异常。 范围查询: 匹配查询: 组合查询: 组合查询在执行时会引发错误: 引发HTTP_EXCEPTIONS.get(状态代码,TransportError)(状态代码,error_message,Additional_info)ela