在构造 DSL 查询时获取其他文档值
Fetch other document value while framing DSL query
我正在向我的 DSL 查询添加 script_score,以根据源产品的价格提高结果。像这样:
functions":[
{
"script_score":{
"script":"if (doc['price'].size() > 0 && doc['price'].value == 1000.0) {15}"
}
}
],
此处“1000.0”是不属于响应的一份文件的价格。为此,我必须查询 2 次,首先获取该文档的价格,然后构建查询并将价格添加到查询并提升结果,这会导致性能下降。
应该有一些方法可以使用无痛脚本来获取 id 的值,但我无法获取它。如果有人可以提供帮助,那就太好了。
TIA!
其实是有办法的。我已尝试在下面重现您的案例,希望它与您所拥有的足够接近。
比如说,你有一个价格指数,即从你第一次获取价格应该提高的文件的地方。
PUT prices/_doc/1
{
"price": 1000
}
然后,您的主索引是包含运行第二个查询的文档的索引,假设它是针对产品的,我们有一个产品的价格为 1000,另一个产品的价格为 500。
PUT products/_doc/q
{
"name": "product q",
"price": 1000
}
PUT products/_doc/2
{
"name": "product 2",
"price": 500
}
现在,查询将如下所示。在 function_score
查询中,我们将价格与价格索引中 ID 为 1 的文档的价格相匹配的文档提高 15(即脚本中的硬编码值)。 terms lookup
query 将从指定文档(即 ID 为 1)中获取 1000 的 price
,然后将权重为 15 的具有该价格的文档提升。
GET products/_search
{
"query": {
"function_score": {
"functions": [
{
"weight": 15,
"filter": {
"terms": {
"price": {
"index": "prices",
"id": "1",
"path": "price"
}
}
}
}
]
}
}
}
希望这能解决您的问题。
我正在向我的 DSL 查询添加 script_score,以根据源产品的价格提高结果。像这样:
functions":[
{
"script_score":{
"script":"if (doc['price'].size() > 0 && doc['price'].value == 1000.0) {15}"
}
}
],
此处“1000.0”是不属于响应的一份文件的价格。为此,我必须查询 2 次,首先获取该文档的价格,然后构建查询并将价格添加到查询并提升结果,这会导致性能下降。
应该有一些方法可以使用无痛脚本来获取 id 的值,但我无法获取它。如果有人可以提供帮助,那就太好了。 TIA!
其实是有办法的。我已尝试在下面重现您的案例,希望它与您所拥有的足够接近。
比如说,你有一个价格指数,即从你第一次获取价格应该提高的文件的地方。
PUT prices/_doc/1
{
"price": 1000
}
然后,您的主索引是包含运行第二个查询的文档的索引,假设它是针对产品的,我们有一个产品的价格为 1000,另一个产品的价格为 500。
PUT products/_doc/q
{
"name": "product q",
"price": 1000
}
PUT products/_doc/2
{
"name": "product 2",
"price": 500
}
现在,查询将如下所示。在 function_score
查询中,我们将价格与价格索引中 ID 为 1 的文档的价格相匹配的文档提高 15(即脚本中的硬编码值)。 terms lookup
query 将从指定文档(即 ID 为 1)中获取 1000 的 price
,然后将权重为 15 的具有该价格的文档提升。
GET products/_search
{
"query": {
"function_score": {
"functions": [
{
"weight": 15,
"filter": {
"terms": {
"price": {
"index": "prices",
"id": "1",
"path": "price"
}
}
}
}
]
}
}
}
希望这能解决您的问题。