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

弹性搜索中的查询与筛选

汪正卿
2023-03-14

我试图为一个文档编制索引,该文档有三个字段:first_name、last_name、占领类型“keyword”,并分别有值XYZ、ABC和DEF。

我已经使用过滤器编写了查询,以便与和条件完全匹配,如下所示,

"query": {
  "bool": {
    "filter": [
      {"term": {"first_name": "XYZ"}},
      {"term": {"last_name": "ABC"}}
    ]
  }
}

这必须返回一个文档,但不返回任何内容。

我对同一个操作有另一个查询,

"query": {
  "bool": {
    "must": [
      {"match": {"first_name": "XYZ"}},
      {"match": {"last_name": "ABC"}}
    ]
  }
}

这将返回一个文档。

根据Elasticsearch文档,我知道查询和筛选的区别在于筛选不会对结果打分。我不知道为什么第一个查询没有返回任何结果。我的理解正确吗?

共有1个答案

子车桐
2023-03-14

正如文档所述,除了评分,查询和筛选之间没有区别。当然,这适用于查询和筛选器使用相同查询类型的情况。这里您使用两种不同的类型-术语匹配<代码>术语用于精确比较,而匹配用于分析并用作全文搜索。

看看下面的例子。

您的映射:

PUT /index_53053054
{
  "mappings": {
    "_doc": {
      "properties": {
        "first_name": {
          "type": "text"
        },
        "last_name": {
          "type": "text"
        },
        "occupation": {
          "type": "keyword"
        }
      }
    }
  }
}

您的文件:

PUT index_53053054/_doc/1
{
  "first_name": "XYZ",
  "last_name": "ABC",
  "occupation": "DEF"
}

过滤器查询:

GET index_53053054/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "first_name": "XYZ"
          }
        },
        {
          "match": {
            "last_name": "ABC"
          }
        },
        {
          "term": {
            "occupation": "DEF"
          }
        }
      ]
    }
  }
}

和结果:

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0,
    "hits": [
      {
        "_index": "index_53053054",
        "_type": "_doc",
        "_id": "1",
        "_score": 0,
        "_source": {
          "first_name": "XYZ",
          "last_name": "ABC",
          "occupation": "DEF"
        }
      }
    ]
  }
}

类似的必须查询:

GET index_53053054/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "first_name": "XYZ"
          }
        },
        {
          "match": {
            "last_name": "ABC"
          }
        },
        {
          "term": {
            "occupation": "DEF"
          }
        }
      ]
    }
  }
}

答复:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.8630463,
    "hits": [
      {
        "_index": "index_53053054",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.8630463,
        "_source": {
          "first_name": "XYZ",
          "last_name": "ABC",
          "occupation": "DEF"
        }
      }
    ]
  }
}

如您所见,点击次数几乎相同。唯一的区别是在过滤器中不计算分数,而在必须查询中则不计算分数。

阅读更多:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-filter-context.html

 类似资料:
  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我刚加入弹性搜索公司。而不知道如何在JSON请求中对索引和an类型发出正确的请求?(所以我不想像localhost:9200/myindex/mytype/_search那样在URL中使用索引和类型,而是向localhost:9200/_search发出JSON请求) 我试过这样的东西。但我得到的结果是'AAA'索引而不是'BBB'索引。如何只从bbb索引得到结果或者根本没有结果?

  • 我在术语查询中要求弹性搜索中的嵌套字段,其中嵌套字段值应与术语查询中提供的值的数量完全匹配。例如,考虑下面的查询,在这里我们对名为类型的嵌套字段进行查询。 GET资产/_search 索引映射 样本文件: 上述查询应返回字段类型正好有2个值的文档,即“VOD”

  • 如何获得空数组和美国的结果和

  • 关于如何打开缓存有什么建议吗?