我目前正在使用elasticsearch,并试图从Java后端实现一个查询,该查询不仅按术语而且按字段优先级从索引中查询文档。在我的索引中,我的文档包含一个术语和一个指定类型的字段。
e.g
term: "Flu Shot"
type: "procedure"
term: "Fluphenazine"
type: "drug"
我创建了一个按术语搜索的查询,弹性索引将返回匹配该术语的最相关的结果。我想要创建的功能是创建一个查询,以返回匹配同一项的结果,但按“type”字段的优先级排序。例如,当我输入“flu”时,我希望首先获得类型为“procedure”的文档,然后在它们后面获得类型为“drug”的文档。目前,由于许多药物以“流感”开头,索引只返回类型为“药物”的文档。
您可以使用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以便弹性搜索不会删除标点符号等。