问答

按相关性对ElasticSearch文档中的关键字字段数组进行排序

 来源    2019-05-14    1  

我有一个看起来像这样的ElasticSearch索引:

{
    "mappings": {
        "article": {
            "properties": {
                "title": { "type": "string" },
                "tags": {
                    "type": "keyword"
                },
        }
    }
}

和看起来像这样的数据:

{ "title": "Something about Dogs", "tags": ["articles", "dogs"] },
{ "title": "Something about Cats", "tags": ["articles", "cats"] },
{ "title": "Something about Dog Food", "tags": ["articles", "dogs", "dogfood"] }

如果我搜索狗,我会得到第一和第三份文件,正如我所期望的那样.而且我可以按照我喜欢的方式对搜索文档进行加权(实际上,我正在使用function_score查询来加权一堆与此问题无关的字段).

我想要做的是对标记字段进行排序,以便首先返回最相关的标记,而不会影响文档本身的排序顺序.所以我希望得到这样的结果:

{ "title": "Something about Dog Food", "tags": ["dogs", "dogfood", "articles"] }

而不是我现在得到的:

{ "title": "Something about Dog Food", "tags": ["articles", "dogs", "dogfood"] }

sortfunction score的文档不包括我的案例.任何帮助赞赏.谢谢!

鉴于其“匹配”功能,您无法对文档的_source(您的标记数组)进行排序.一种方法是使用嵌套字段和inner_hits,它允许您对匹配的嵌套字段进行排序.

我的建议是在嵌套字段中转换您的标签(我只是简单地选择了关键字,但您也可以选择文本和分析器):

PUT test
{
  "mappings": {
    "article": {
      "properties": {
        "title": {
          "type": "string"
        },
        "tags": {
          "type": "nested",
          "properties": {
            "value": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

并使用这种查询:

GET test/_search
{
  "_source": {
    "exclude": "tags"
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "dogs"
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "should": [
                  {
                    "match_all": {}
                  },
                  {
                    "match": {
                      "tags.value": "dogs"
                    }
                  }
                ]
              }
            },
            "inner_hits": {
              "sort": {
                "_score": "desc"
              }
            }
          }
        }
      ]
    }
  }
}

如果您尝试匹配标记的嵌套字段值,则尝试在标题上匹配.然后,使用inner_hits排序,您可以实际根据内部评分对嵌套值进行排序.

@ Val的建议非常好,但只要你的“相关标签”你只需要一个简单的文本匹配作为子串(i1.indexOf(params.search))就可以了.他的解决方案的最大优势是您不必更改映射.

我的解决方案的最大优势是您实际上使用Elasticsearch真正的搜索功能来确定“相关”标签.但缺点是您需要嵌套字段而不是常规的简单关键字.

相关文章
检查Elasticsearch文档中是否存在字段的最佳方法
问答可能是一个非常愚蠢的问题,检查elasticsearch中的文档字段是否存在的最佳方法是什么?我在文档中找不到任何内容. 例如,如果此文档没有字段/键"价格",我不想在结果中返回. ...
1
从Elasticsearch文档中删除字段
问答我需要删除索引到Elasticsearch的所有文档中的字段.我该怎么做.是否有任何删除查询可以帮助我实现这一目标.::@backtrack说的是真的,但是在Elasticsearch中有一个非常方便 ...
1
如何获取elasticsearch文档中每个单词的总数?
问答我搜索了这个问题,但找不到任何有用的答案.我想获得文档中每个单词的总计数,例如我的索引中有一些推文,并且有一条推文上写着这样的话:"这里很无聊,我想去我家甜蜜的家".查询应该返回如 ...
1
如何使用PHP更新/替换ElasticSearch文档中的字段?
问答我想更新我的Elasticsearch索引文档的字段.就我而言,它是标签字段. 这是我目前的代码: // Index tags in the page document $es_client-> ...
1
在elasticsearch中,有没有办法显示文档中的哪个字段是“命中”?
问答使用elasticsearch搜索某些文档时,我想查看文档中哪个字段是"命中",将其标记为搜索结果.是否有本地方式来执行此操作,或者我是否需要在搜索客户端中执行此操作? 例如: G ...
1
是否可以阻止文档中的某些字段包含在CouchDB中的复制中?
问答场景:也许某些字段是敏感的,不应该发送,即帐户相关信息 – 可以一次排除它们还是需要存储在单独的文档中?::不,这是不可能的. 您可以执行过滤复制,以便仅复制某些文档,这是一种非常常见的机制,用于确保 ...
MongoDB聚合查询 – 重命名嵌入式文档中返回的字段
问答我目前正在使用聚合运算符来返回具有嵌入(子)文档数组的文档.我想重命名数组的字段名称,并重命名数组的嵌入文档中的字段名称. 例如,对于投影,我想将数组从"朋友"重命名为" ...
1
如何测试MongoDB文档中的字符串字段是否为空?
问答我试图获得具有空字符串的字段的文档数.这个字段,让我们称之为"Field_One"存在于所有文档中(因此,要清楚,我不是要查找该字段是否存在,我想在字段中找到哪些文档没有任何内容( ...
弹性搜索:文档中自定义得分字段的影响评分
问答我有一组通过NLP algos从文本中提取的单词,每个文档中每个单词的相关分数. 例如 : document 1: { "vocab": [ {"wtag":& ...
1
mongodb – 当父字段不知道时,在嵌套文档中查找具有字段的记录
问答使用如下文件的集合,我需要找到特定字段的文档 – 例如. lev3_field2(在下面的文件中)存在. 我尝试了以下内容,但是这并不返回任何结果,尽管在某些文档中存在lev3_field2字段. d ...
1
javascript – 使用findOne更新mongoDB文档中的子字段并保存
问答我正在尝试更新mongoDB文档中的特定子字段,并决定首先找到有问题的对象,然后保存更新的对象.出于某种原因,保存选项似乎忽略了我的更改. 我的集合中有一个对象,它符合以下架构: var tschem ...
1
mongodb – 如何用原子操作在一个文档中切换布尔字段?
问答有没有办法用原子操作在MongoDB中切换ONE文档的布尔字段?说,(在python) cl.update({"_id": ...}, {"$toggle": ...
1
如何从MongoDB文档中的双重嵌套数组中删除元素
问答我有一个文档结构的东西沿着以下线: { "_id" : "777", "someKey" : "someValue", ...
1
将嵌入的文档插入mongodb文档中的新字段
问答我在mongodb集合中有一个文档,如下所示: { _id: 133, Name: "abc", Price: 20 } 我想添加一个新的字段"PackSizes&quo ...
1
javascript – Firestore – 从文档中获取特定字段
问答我需要的: 我想在Firestore中使用各自的字段保存文章或注释: >标题 >内容(文本或段落) >创作日期 >所有者(与其他人分享该文章) 人和谁可以编辑它们像:https ...
数组 – CouchDB:在文档中插入一个新数组
问答我有一份文件: { "_id": "00001.74365CF0449457AA5FB52822DBE1F22A", "_rev": &qu ...
如何在XML文档中引用C#关键字?
问答例如,不工作 – 我得到编译警告:XML注释-具有语法错误的cref属性'switch' 上下文为有兴趣的人- /// <summary>Provides base functionali ...
1
javascript – 如何从文档中排除一些字段
问答我有以下简单的shema: var userSchema = new Schema({ name : String, age: Number, _creator: Schema.ObjectId }) ...
从Excel VBA更新Word文档中的链接字段
问答我试图通过将数据放入电子表格并链接到Word中的相应单元格,自动更新3个不同Word文档中的某些信息(如名称,日期和数字).电子表格中包含一些宏,可以在内部自动更新电子表格的各个部分. 除了更新Wor ...