拥有这些文件:
{
"created_at" : "2017-07-31T20:30:14-04:00",
"description" : null,
"height" : 3213,
"id" : "1",
"tags" : [
{
"confidence" : 65.48948436785749,
"tag" : "beach"
},
{
"confidence" : 57.31950504425406,
"tag" : "sea"
},
{
"confidence" : 43.58207236617374,
"tag" : "coast"
},
{
"confidence" : 35.6857910950816,
"tag" : "sand"
},
{
"confidence" : 33.660057321079655,
"tag" : "landscape"
},
{
"confidence" : 32.53252312423727,
"tag" : "sky"
}
],
"width" : 5712,
"color" : "#0C0A07",
"boost_multiplier" : 1
}
和
{
"created_at" : "2017-07-31T20:43:17-04:00",
"description" : null,
"height" : 4934,
"id" : "2",
"tags" : [
{
"confidence" : 84.09123410403951,
"tag" : "mountain"
},
{
"confidence" : 56.412795342449456,
"tag" : "valley"
},
{
"confidence" : 48.36547551196872,
"tag" : "landscape"
},
{
"confidence" : 40.51100450186575,
"tag" : "mountains"
},
{
"confidence" : 33.14263528292239,
"tag" : "sky"
},
{
"confidence" : 31.064394646169404,
"tag" : "peak"
},
{
"confidence" : 29.372,
"tag" : "natural elevation"
}
],
"width" : 4016,
"color" : "#FEEBF9",
"boost_multiplier" : 1
}
我想获得基于每个标签的置信度值计算的_score。例如,如果您搜索“ mountain”,则显然应该仅返回ID为1的文档;如果您搜索“
landscape”,则得分2应该高于1,因为景观对2的置信度高于1(48.36 vs 33.66)。如果您搜索“ coast
landscape”,则此时间得分1应该高于2,因为doc 1在标签数组中同时包含了Coast和Landscape。我还想将分数与“
boost_multiplier”相乘,以增强某些文档的性能。
我在Elasticsearch中发现了这个问题:文档中具有自定义得分字段的影响力得分
但是,当我尝试接受的解决方案(我在我的ES服务器中启用脚本)时,无论搜索词如何,它都返回带有_score 1.0的两个文档。这是我尝试过的查询:
{
"query": {
"nested": {
"path": "tags",
"score_mode": "sum",
"query": {
"function_score": {
"query": {
"match": {
"tags.tag": "coast landscape"
}
},
"script_score": {
"script": "doc[\"confidence\"].value"
}
}
}
}
}
}
我还尝试了@yahermann在注释中建议的内容,将“ script_score”替换为“ field_value_factor”:{“ field”:“
confidence”},结果仍然相同。知道为什么它会失败,或者有更好的方法吗?
只是为了全面了解,这是我使用的映射定义:
{
"mappings": {
"photo": {
"properties": {
"created_at": {
"type": "date"
},
"description": {
"type": "text"
},
"height": {
"type": "short"
},
"id": {
"type": "keyword"
},
"tags": {
"type": "nested",
"properties": {
"tag": { "type": "string" },
"confidence": { "type": "float"}
}
},
"width": {
"type": "short"
},
"color": {
"type": "string"
},
"boost_multiplier": {
"type": "float"
}
}
}
},
"html" target="_blank">settings": {
"number_of_shards": 1
}
}
更新
在下面@Joanna的答案之后,我尝试了查询,但是实际上,无论我在匹配查询,coast,foo,bar中放置什么,它总是返回两个文档都带有_score1.0的文档,我在elasticsearch2.4上进行了尝试Docker中的.6、5.3、5.5.1。这是我得到的答复:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 1635
{"took":24,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":1.0,"hits":[{"_index":"my_index","_type":"my_type","_id":"2","_score":1.0,"_source":{
"created_at" : "2017-07-31T20:43:17-04:00",
"description" : null,
"height" : 4934,
"id" : "2",
"tags" : [
{
"confidence" : 84.09123410403951,
"tag" : "mountain"
},
{
"confidence" : 56.412795342449456,
"tag" : "valley"
},
{
"confidence" : 48.36547551196872,
"tag" : "landscape"
},
{
"confidence" : 40.51100450186575,
"tag" : "mountains"
},
{
"confidence" : 33.14263528292239,
"tag" : "sky"
},
{
"confidence" : 31.064394646169404,
"tag" : "peak"
},
{
"confidence" : 29.372,
"tag" : "natural elevation"
}
],
"width" : 4016,
"color" : "#FEEBF9",
"boost_multiplier" : 1
}
},{"_index":"my_index","_type":"my_type","_id":"1","_score":1.0,"_source":{
"created_at" : "2017-07-31T20:30:14-04:00",
"description" : null,
"height" : 3213,
"id" : "1",
"tags" : [
{
"confidence" : 65.48948436785749,
"tag" : "beach"
},
{
"confidence" : 57.31950504425406,
"tag" : "sea"
},
{
"confidence" : 43.58207236617374,
"tag" : "coast"
},
{
"confidence" : 35.6857910950816,
"tag" : "sand"
},
{
"confidence" : 33.660057321079655,
"tag" : "landscape"
},
{
"confidence" : 32.53252312423727,
"tag" : "sky"
}
],
"width" : 5712,
"color" : "#0C0A07",
"boost_multiplier" : 1
}
}]}}
UPDATE-2 我在SO上发现了这一点:Elasticsearch:带有“boost_mode”的“function_score”:“replace”忽略了函数得分
它的基本含义是,如果函数不匹配,则返回1。这是有道理的,但我正在对同一文档运行查询。令人困惑。
最后更新
最终我发现了问题,我很愚蠢。ES101,如果您发送GET请求以搜索api,它将返回所有得分为1.0的文档:)您应该发送POST请求…非常感谢@Joanna,它运行良好!
您可以尝试使用此查询-它结合了得分:confidence
和boost_multiplier
字段:
{
"query": {
"function_score": {
"query": {
"bool": {
"should": [{
"nested": {
"path": "tags",
"score_mode": "sum",
"query": {
"function_score": {
"query": {
"match": {
"tags.tag": "landscape"
}
},
"field_value_factor": {
"field": "tags.confidence",
"factor": 1,
"missing": 0
}
}
}
}
}]
}
},
"field_value_factor": {
"field": "boost_multiplier",
"factor": 1,
"missing": 0
}
}
}
}
当我搜索coast
字词时-它返回:
id=1
仅具有此术语的文档具有该术语,得分为"_score": 100.27469
。当我搜索landscape
术语时-它返回两个文档:
id=2
得分为“ _score”的文档:85.83046id=1
得分为“ _score”的文档:59.7339由于id=2
具有较高confidence
字段值的文档,其得分更高。
当我搜索coast landscape
术语时-它返回两个文档:
id=1
得分为“ _score”的文档:160.00859id=2
得分为“ _score”的文档:85.83046尽管id=2
具有的文档具有较高的confidence
字段值,但是具有的文档id=1
具有匹配的单词,因此得分更高。通过更改"factor": 1
参数的值,您可以决定confidence
应多少影响结果。
当我为一个新文档建立索引时,会发生更有趣的事情:假设它与具有的文档几乎相同,id=2
但是我设置了"boost_multiplier" : 4
和"id": 3
:
{
"created_at" : "2017-07-31T20:43:17-04:00",
"description" : null,
"height" : 4934,
"id" : "3",
"tags" : [
...
{
"confidence" : 48.36547551196872,
"tag" : "landscape"
},
...
],
"width" : 4016,
"color" : "#FEEBF9",
"boost_multiplier" : 4
}
使用coast landscape
term 运行相同的查询将返回三个文档:
id=3
得分为“ _score”的文档:360.02664id=1
得分为“ _score”的文档:182.09859id=2
得分为“ _score”的文档:90.00666尽管的文档id=3
只有一个匹配的单词(landscape
),但其boost_multiplier
值大大提高了评分。在此处,"factor": 1
您还可以使用决定该值应增加多少分值,并"missing": 0
确定如果没有索引该字段应发生什么。
有这些文件的: 和 我想要获得_score根据每个标记的置信度值计算出来的值。例如,如果您搜索“mountain”,它应该只返回id为1的doc,显然,如果您搜索“landsacture”,得分2应该高于1,因为landsacture在2中的置信度高于1(48.36 vs 33.66)。如果您搜索“海岸景观”,这个时间得分1应该高于2,因为doc1在tags数组中同时包含海岸和景观。我还想用“bo
问题内容: 我有一组通过NLP算法从文本中提取的单词,以及每个文档中每个单词的相关分数。 例如 : 我希望每个文档中的match 都可以影响ES给它的给定值,或者乘以或加到上,以影响结果文档的最终(依次,顺序)。有什么办法可以做到这一点? 问题答案: 解决此问题的另一种方法是使用嵌套文档: 首先设置映射以创建一个嵌套文档,这意味着每个/ 文档将在内部作为单独的文档建立索引: 然后索引您的文档: 并
问题内容: 我试图找到与当前正在查看的标签相关的标签。我们索引中的每个文档都被标记。每个标签由两部分组成-ID和文本名称: 要获取相关标签,我只是查询文档并获取其标签的集合: 这非常有效,我得到了想要的结果。但是,我需要标签ID 和 名称才能执行任何有用的操作。我已经探索了如何做到这一点,解决方案似乎是: 索引时合并字段 将字段拼凑在一起的脚本 嵌套聚合 选项1和2对我不可用,因此我一直在使用3,
这工作得很完美,我得到了我想要的结果。但是,我需要标记ID和名称来做任何有用的事情。我已经探索了如何实现这一点,解决方案似乎是: 索引时合并字段 将字段集中在一起的脚本 嵌套聚合 选项一和选项二对我来说是不可用的,所以我一直在用3,但它没有以预期的方式做出反应。给定以下查询(仍在搜索还标记有“饼干”的文档): 我会得到这个结果: 嵌套聚合包括搜索项和我要搜索的标记(按字母顺序返回)。 我曾试图通过
我正在向elasticsearch发送查询,它会响应其文档中字段的未知顺序。我如何修复elsasticsearch返回文档中字段的顺序?我的意思是,我正在发送这个查询: 当它回应时,它给了我一些不正常的东西。我最后想将其转换为csv,并修复csv标题。有什么方法可以让我得到像doc1:{“field1”,“field2”,“field3”,“field14”}doc2:{“field1”,“fie