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

查询与筛选器

金谭三
2023-03-14

我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

共有3个答案

缑文栋
2023-03-14

假设索引包含三个文档:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'
curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

文档“你好,世界!我是山姆。”的分数高于“你好,世界!” ,因为前者匹配查询中的两个单词。对文件进行评分。

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

返回包含hello或sam的文档。文件未评分。

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
鲁靖
2023-03-14

官方文件是这样说的:

一般来说,应使用过滤器而不是查询:

  • 用于二进制是/否搜索
  • 用于查询确切值

作为一般规则,应使用查询而不是过滤器:

  • 用于全文搜索
  • 其中结果取决于相关性分数
阎雪峰
2023-03-14

区别很简单:过滤器是缓存的,不会影响分数,因此比查询更快。也来看看这里。假设一个查询通常是用户键入的,并且几乎不可预测,而过滤器可以帮助用户缩小搜索结果的范围,例如使用方面。

 类似资料:
  • 我试图为一个文档编制索引,该文档有三个字段:first_name、last_name、占领类型“keyword”,并分别有值XYZ、ABC和DEF。 我已经使用过滤器编写了查询,以便与和条件完全匹配,如下所示, 这必须返回一个文档,但不返回任何内容。 我对同一个操作有另一个查询, 这将返回一个文档。 根据Elasticsearch文档,我知道查询和筛选的区别在于筛选不会对结果打分。我不知道为什么第

  • 好吧,这一个对你们中的一个超级棒的弹性搜索专家来说可能不会太难。我得到了这个嵌套查询,我希望嵌套查询在一个非嵌套字段(状态)上进行过滤。我不知道把过滤器放在哪里。我试着把它放在一个查询中(如下),但没有给出正确的结果。你能帮我吗?

  • 我有一个查询,我需要过滤出结果。 这是我的查询 我得到一个错误,说注册[query]。我显然有一个筛选字段的查询。我遵循elasticsearch页面上筛选的查询文档中给出的格式。https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filtered-query.html

  • ID 主题 semester_id 年份 节 Professor_ID 具有以下属性: ID 教员 super_user first_name last_name 但我不确定该用哪一种。 目前,我正在使用后者的扩展形式。我的推理是,如果我想添加过滤/排序标准,它更可缩放。 是否有使用查询字符串与资源路径进行筛选条件的标准实践?过去一些较大的API做了什么?是否可以接受或鼓励同时使用两个范例(使两个

  • 我在spark 1.2.1上使用datastax/spark-cassandra-connector和充满1B+行的C*表(datastax-enterprise dse 4.7.0)。我需要对时间戳参数执行范围筛选/Where查询。 使用rdd和JoinWithCassandraTable还是使用数据帧和PushDown?还有别的事吗?

  • 我正在尝试查找一个查询唯一的名称列表,并排除两个查询结果之间的共同名称。例如,我想要学生A、B和C所选课程的名称,并从该列表中排除学生D和E所选的课程。在这个问题的答案的帮助下(Neo4j Cypher:从结果中排除某些节点),我尝试了这个密码代码,它是有效的,但我得到的结果是节点。我希望它是一个名称列表,而不是节点。 非常感谢。