当前位置: 首页 > 知识库问答 >
问题:

弹性搜索-按术语和字段优先级查询文档

毛宏达
2023-03-14

我目前正在使用elasticsearch,并试图从Java后端实现一个查询,该查询不仅按术语而且按字段优先级从索引中查询文档。在我的索引中,我的文档包含一个术语和一个指定类型的字段。

e.g 
term: "Flu Shot"
type: "procedure"

term: "Fluphenazine"
type: "drug"

我创建了一个按术语搜索的查询,弹性索引将返回匹配该术语的最相关的结果。我想要创建的功能是创建一个查询,以返回匹配同一项的结果,但按“type”字段的优先级排序。例如,当我输入“flu”时,我希望首先获得类型为“procedure”的文档,然后在它们后面获得类型为“drug”的文档。目前,由于许多药物以“流感”开头,索引只返回类型为“药物”的文档。

共有1个答案

周苑博
2023-03-14

您可以使用function_score

function_score允许您修改查询检索的文档的分数。要使用function_score,用户必须定义一个查询和一个或多个函数,为查询返回的每个文档计算新的分数。

举例说明您所讨论的数据(使用Elasticsearch server 7.9):

 PUT /example_index
 {
   "mappings": {
     "properties": {
       "term": {"type": "text" },
       "type": {"type": "keyword"}
     }
   }
 }

 PUT /_bulk
 {"create": {"_index": "example_index", "_id": 1}}
 {"term": "Flu Shot", "type": "procedure"}
 {"create": {"_index": "example_index", "_id": 2}}
 {"term": "Fluphenazine", "type": "drug"}
 {"create": {"_index": "example_index", "_id": 3}}
 {"term": "Flu Shot2", "type": "procedure"}
 {"create": {"_index": "example_index", "_id": 4}}
 {"term": "Fluphenazine2", "type": "drug"}

使用自定义评分逻辑查询文档

 GET /example_index/_search
 {
   "query": {
     "function_score": {
       "query": {
         "wildcard": {
           "term": {
             "value": "*flu*"
           }
         }
       },
       "functions": [
         {
           "filter": {
             "term": {
               "type": "procedure"
             }
           },
           "weight": 2
         },
         {
           "filter": {
             "term": {
               "type": "drug"
             }
           },
           "weight": 1
         }
       ]
     }
   }
 }

结果:

 {
   "took" : 2,
   "timed_out" : false,
   "_shards" : {
     "total" : 1,
     "successful" : 1,
     "skipped" : 0,
     "failed" : 0
   },
   "hits" : {
     "total" : {
       "value" : 4,
       "relation" : "eq"
     },
     "max_score" : 2.0,
     "hits" : [
       {
         "_index" : "example_index",
         "_type" : "_doc",
         "_id" : "1",
         "_score" : 2.0,
         "_source" : {
           "term" : "Flu Shot",
           "type" : "procedure"
         }
       },
       {
         "_index" : "example_index",
         "_type" : "_doc",
         "_id" : "3",
         "_score" : 2.0,
         "_source" : {
           "term" : "Flu Shot2",
           "type" : "procedure"
         }
       },
       {
         "_index" : "example_index",
         "_type" : "_doc",
         "_id" : "2",
         "_score" : 1.0,
         "_source" : {
           "term" : "Fluphenazine",
           "type" : "drug"
         }
       },
       {
         "_index" : "example_index",
         "_type" : "_doc",
         "_id" : "4",
         "_score" : 1.0,
         "_source" : {
           "term" : "Fluphenazine2",
           "type" : "drug"
         }
       }
     ]
   }
 }

您可以看到将类型设置为过程的文档的得分高于将类型设置为药物的文档。这是因为我们在function_score中为不同的类型分配了不同的权重。

 类似资料:
  • 实现此功能的推荐方法是什么?注意,我使用的是查询字符串查询。

  • 假设我有三个指数:城市、博物馆和景点。 现在我正在查询一个术语的所有索引(),例如“维也纳” 作为结果,我得到: 维也纳:维也纳艺术博物馆 有没有办法优先考虑指数,这样我就可以得到第一个城市,而不是景点,最后是博物馆,就像这样: 维也纳 维也纳的Riesenrad 维也纳:维也纳艺术博物馆 维也纳:维也纳历史博物馆

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 我试图为一个业务场景制定一个查询,其中我们有一个名为“types”的嵌套字段类型(即类似于字符串的ArrayList)。下面是以“类型”作为字段之一的索引文档示例。 文件1:{“类型”:[{“标签”:“对话”,},{“标签”:“暴力”,},{“标签”:“语言”,}} 文档2:{“类型”:[{“标签”:“对话框”,}} 现在,要求搜索查询最多匹配字段值中的一个值,即如果用户搜索“对话框”,那么它应该

  • 我需要将属性设置为not analysis以便弹性搜索不会删除标点符号等。