elasticsearch ElasticSearch:如何使用edge_ngram并首先显示真实的相关点击,elasticsearch,e-commerce,elasticsearch,E Commerce" /> elasticsearch ElasticSearch:如何使用edge_ngram并首先显示真实的相关点击,elasticsearch,e-commerce,elasticsearch,E Commerce" />

elasticsearch ElasticSearch:如何使用edge_ngram并首先显示真实的相关点击

elasticsearch ElasticSearch:如何使用edge_ngram并首先显示真实的相关点击,elasticsearch,e-commerce,elasticsearch,E Commerce,我是elasticsearch的新手,我正在尝试开发一个电子商务搜索,向用户推荐5~10个匹配产品 由于它应该在用户打字时工作,我们在官方文档中发现使用edge_ngram和它有点工作。但当我们搜索测试时,结果并不是预期的。如下例所示(在我们的测试中) 如图所示,术语“Furadeira”(电钻)的结果返回电钻之前的附件。我如何提高结果?我想,即使是在字符串中找到匹配项的顺序也会对我有所帮助 这是我到目前为止的代码: //举个例子 { “设置”:{ “碎片数”:1, “分析”:{ “过滤器”

我是elasticsearch的新手,我正在尝试开发一个电子商务搜索,向用户推荐5~10个匹配产品

由于它应该在用户打字时工作,我们在官方文档中发现使用edge_ngram和它有点工作。但当我们搜索测试时,结果并不是预期的。如下例所示(在我们的测试中)

如图所示,术语“Furadeira”(电钻)的结果返回电钻之前的附件。我如何提高结果?我想,即使是在字符串中找到匹配项的顺序也会对我有所帮助

这是我到目前为止的代码:

//举个例子
{
“设置”:{
“碎片数”:1,
“分析”:{
“过滤器”:{
“自动完成过滤器”:{
“类型”:“边缘图”,
“最小克”:1,
“最大克数”:20
},
“葡萄牙站”:{
“类型”:“停止”,
“停止语”:“葡萄牙语”
},
“葡萄牙语词干分析器”:{
“类型”:“词干分析器”,
“语言”:“轻葡萄牙语”
}
},
“分析器”:{
“葡萄牙语”:{
“类型”:“自定义”,
“标记器”:“标准”,
“过滤器”:[
“小写”,
“葡萄牙站”,
“葡萄牙语词干分析器”
]
},
“自动完成”:{
“类型”:“自定义”,
“标记器”:“标准”,
“过滤器”:[
“小写”,
“自动完成过滤器”
]
}
}
}
} 
}
/*映射*/
//PUT/example/products/\u映射
{
“产品”:{
“财产”:{
“姓名”:{
“类型”:“文本”,
“分析器”:“自动完成”,
“搜索引擎分析器”:“标准”
}
}
}
}
/*搜寻*/
//获取/示例/产品/\u搜索
{
“查询”:{
“查询字符串”:{
“查询”:“furadeira”,
“type”:“most_fields”,//也尝试不使用此选项
“字段”:[
“名称^8”,
“型号^10”,
“制造商^4”,
“说明”
]
}
}
}
/*产品示例*/
//举例说明/产品/38313
{
“名称”:“FITA VEDA FRESTA(ESPUMA 4503)12X5米[H000016055]”,
“描述”:“产品特征:Ve…Diminui ruidos indesejaveis.”,
“价格”:21.90,
“产品id”:38313,
“图像”:http://placehold.it/200x200",
“数量”:92,
“宽度”:20.200,
“高度”:1.500,
“长度”:21.500,
“重量”:0.082,
“型号”:“167083”,
“制造商”:“3M巴西公司”

}
您可以将查询增强为所谓的布尔查询,它在
must
子句中包含现有查询,但在
should
子句中有一个额外的查询,该查询完全匹配(不使用ngrammed字段)。如果查询与should子句匹配,则得分更高


请参阅文档。

让我们假设您有一个区分主产品和附件的字段。我称之为水平场

现在您可以使用两种方法:

1) 通过添加“应该”操作提高主要产品的分数: 将主查询放在“必须”操作和“应该”操作的“使用级别”字段中,以提高作为主要产品的文档的_分数

{
    "query": {
        "bool": {
            "must": {
                "match": {  
                    "name": {
                        "query":    "furadeira"
                    }
                }
            },
            "should": [
                { "match": {
                    "level_field": {
                        "query": "level1",
                        "boost": 3 
                    }
                }},
                { "match": {
                    "level_field": {
                        "query": "level2",
                        "boost": 2 
                    }
                }}
            ]
        }
    }
}
2) 在第二种方法中,您可以通过使用boosting查询来降低非主要产品文档的_分数:

{
  "query": {
    "boosting": {
      "positive": {
        "query_string": {
          "query" : "furadeira",
          "type" : "most_fields",
          "fields" : [
              "name^8",
              "model^10",
              "manufacturer^4",
              "description" 
              ]
          }
        }
      },
      "negative": {
        "term": {
          "level_field": {
            "value": "level2"
          }
        }
      },
      "negative_boost": 0.2
    }
    }
}

我希望有帮助

谢谢你的回答!不幸的是,我尝试使用bool,得到了同样的结果。谢谢你的回答!这实际上是一个很好的解决方案,但不是在这种情况下。因为如果人员正在寻找附件,则附件的相关性不低于电钻。在这种情况下,搜索本身需要更加精确。