带有单独唯一值检查的 ES 查询字符串查询

ES Query string query with separate unique value check

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

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

不过,我想在同一个查询中包括对项目类别的搜索,希望以某种方式标记或分隔它们,以便它们可以被推到前端结果的顶部。项目类别在单独的字段中,单个项目的 _source 如下所示,

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

因此,如果搜索输入是 "Whatever*",它应该既是 returning 名称为 Whatever 的项目,又是单独的 return 包含 "Whatever"(并非所有具有 "Whatever Category" 的项目)。所以它应该是 returning 名称匹配的项目,可以有任何类别,以及所有项目之间的可用类别。这可以结合在一个查询中吗?

您有几个选项,但我会首先尝试以下两个选项。

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

{
  "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"
            }
          }
        }
      ]
    }
  }
}

但是,上面的查询可能 return 同一个类别多次,而某些其他类别根本不是,这取决于您选择的大小。因此,更好的查询将是下面那个利用类别部分的聚合的查询。它将 return 匹配部分中的项目和聚合部分中的唯一类别匹配:

{
  "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
          }
        }
      }
    }
  }
}