带有单独唯一值检查的 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_match
或 category_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
}
}
}
}
}
}
我有一个查询字符串查询,其中从即时搜索输入字段搜索项目名称
{
"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_match
或 category_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
}
}
}
}
}
}