【问题标题】:ES Query string query with separate unique value checkES Query 字符串查询,带有单独的唯一值检查
【发布时间】:2018-11-26 22:19:00
【问题描述】:

我有一个查询字符串查询,从即时搜索输入字段中对项目名称进行搜索

{
"query": {
    "query_string" : {
        "default_field" : "name",
        "query" : "'.$searchQuery.'"
    }
}
}

然而,我想在同一个查询中包含对项目类别的搜索,希望以某种方式标记或分隔,以便可以将它们推送到前端结果的顶部。项目类别在一个单独的字段中,单个项目的 _source 看起来像这样,

                "_source": {
                "name": "Whatever Item Name",
                "category": "Whatever Category",

因此,如果搜索输入是“Whatever*”,则它既应该返回名称为“Whatever”的项目,还应该分别返回包含“Whatever”的唯一类别值列表(不是所有具有“Whatever Category”的项目) .所以它应该返回名称匹配的项目,可以有任何类别,以及所有项目中的可用类别。这可以结合在一个查询中吗?

【问题讨论】:

    标签: elasticsearch nested-queries


    【解决方案1】:

    你有几个选择,但这里有两个我会先尝试。

    使用带有标记/命名子查询的单个查询。正如您在下面看到的,在bool/should 中,我们正在查询与some_input 匹配的名称和类别,并略微提升类别,因此它们排名最佳并在结果中冒泡。此外,结果被命名为name_matchcategory_match,因此您知道它们是什么类型的命中。您可能想稍微提高一下。此外,您可能需要调整大小以返回您期望的所有结果:

    {
      "size": 20,
      "query": {
        "bool": {
          "should": [
            {
              "query": {
                "query_string": {
                  "default_field": "name",
                  "query": "some_input",
                  "_name": "name_match"
                }
              }
            },
            {
              "match": {
                "category": {
                  "query": "some_input",
                  "boost": 2,
                  "_name": "category_match"
                }
              }
            }
          ]
        }
      }
    }
    

    但是,根据您选择的大小,上述查询可能会多次返回同一类别,而某些其他类别则根本不返回。因此,更好的查询将是下面的查询,它利用类别部分的聚合。它将返回命中部分中的项目匹配项和聚合部分中的唯一类别匹配项:

    {
      "query": {
        "query_string": {
          "default_field": "name",
          "query": "some_input"
        }
      },
      "aggs": {
        "categories": {
          "filter": {
            "match": {
              "category": {
                "query": "some_input"
              }
            }
          },
          "aggs": {
            "categories": {
              "terms": {
                "field": "category",
                "size": 10
              }
            }
          }
        }
      }
    }
    

    更新

    为了计算所有数据的类别,您可以使用post_filter 而不是query

    {
      "post_filter": {
        "query_string": {
          "default_field": "name",
          "query": "some_input"
        }
      },
      "aggs": {
        "categories": {
          "filter": {
            "match": {
              "category": {
                "query": "some_input"
              }
            }
          },
          "aggs": {
            "categories": {
              "terms": {
                "field": "category",
                "size": 10
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 感谢您的详尽解释。第二个查询正是我想要的。然而,只能让它适用于命中类别中的类别。它是否适用于所有索引类别,无论它们是否在点击中?
    • 太棒了,很高兴它有帮助!
    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2021-01-15
    相关资源
    最近更新 更多