elasticsearch 必须匹配多个值
当我需要文档的属性时,我有一个可以正常工作的查询 只匹配一个值 然而,我还需要能够搜索必须有两个值 所以如果一个香蕉的id为1,一个柠檬的id为2,我会搜索黄色 如果必须条款中有1和2,我将同时得到这两个。 但是如果我只有一个,我就只能得到香蕉
elasticsearch 必须匹配多个值,
elasticsearch,
elasticsearch,当我需要文档的属性时,我有一个可以正常工作的查询 只匹配一个值 然而,我还需要能够搜索必须有两个值 所以如果一个香蕉的id为1,一个柠檬的id为2,我会搜索黄色 如果必须条款中有1和2,我将同时得到这两个。 但是如果我只有一个,我就只能得到香蕉 { "from": 0, "size": 20, "query": { "bool": { "should": [ { "match": { "fruit.color": "yellow" }}
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [
{ "match":
{ "fruit.color": "yellow" }}
],
"must" : [
{ "match": { "fruit.id" : "1" } }
]
}
}
}
我还没有找到一种方法来搜索两个必须的值。
这可能吗?如果仅当id为1或2时才返回文档“必须”,这听起来像是另一个应该子句。如果我正确理解了您的问题,您需要id为1或id为2的文档。此外,如果颜色为黄色,则给它更高的分数
这里有一种方法可以让你实现你想要的目标:
{
"query": {
"bool": {
"should": {
"match": {
"fruit.color": "yellow"
}
},
"must": {
"bool": {
"should": [
{
"match": {
"fruit.id": "1"
}
},
{
"match": {
"fruit.id": "2"
}
}
]
}
}
}
}
}
在这里,我将两个match
查询放在一个单独bool查询的should
子句中。这将实现您正在寻找的目标或行为
再看一看,并注意should
的细微差别。默认情况下,它的行为有所不同,这取决于是否存在同级must
子句,以及是否在筛选器上下文中执行bool查询
另一个可调整并可帮助您实现预期结果的关键选项是minimum\u should\u match
参数 代替匹配查询,您可以简单地尝试对进行查询或在多个术语之间进行匹配
匹配查询通常用于分析的字段。要进行精确匹配,应使用术语查询
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [
{ "match": { "fruit.color": "yellow" } }
],
"must" : [
{ "terms": { "fruit.id": ["1","2"] } }
]
}
}
}
术语或术语查询是获取准确的文本
或id
的完美方法,在id或文本内的搜索中使用匹配查询结果
例:
id='4'
id='44'
使用id=4的匹配查询进行搜索时,会同时返回4和44,因为它在这两个字段中都匹配4。这就是术语查询发挥作用的地方。
使用术语查询的相同搜索将仅返回4
所以被接受的观点是绝对错误的。使用@Rahul答案。您只需要做一件事,而不是文本,您需要将字段作为关键字进行分析
将字段作为文本和关键字编制索引的示例(映射用于嵌套字段的平面级别,并相应地对其进行更改)。
{
"index_patterns": [ "test" ],
"mappings": {
"kb_mapping_doc": {
"_source": {
"enabled": true
},
"properties": {
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
使用@Rahul的答案不起作用,因为你可能会被分析为一个文本
- id-访问文本字段
- id.keyword-访问关键字字段
是的
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [{
"match": {
"color": "yellow"
}
}],
"must": [{
"terms": {
"id.keyword": ["1", "2"]
}
}]
}
}
}
所以我想说,接受的答案将返回错误的结果。请使用@Rahul的答案和相应的映射。@dontberude很高兴我能提供帮助。:)如果你有机会,考虑接受我的回答,让其他有类似问题的StAccess用户也能从中受益。谢谢老兄!一直在寻找一种在同一字段上实现多个必须的方法。非常感谢!我花了很长时间试图将应该
包含在与必须
相同的级别上,但失败了。取决于映射,如果设置正确,它会工作,否则不会返回结果。您可能会将字段作为文本进行分析。需要将其作为关键字进行分析。