Elastic Search 2.0/2.1 问题与荧光笔和 Bool 查询
Elastic Search 2.0/2.1 Issue with Highlighter and the Bool Query
我在 Elastic 2.0 和 2.1 中突出显示时遇到问题 - return它提供的信息比我想象的要多。
我正在构建一个 bool 查询(filtered 查询关键字在 2.0+ 中已弃用,因此我正在尝试更新我的语法)。我正在查询中构建一个 must 部分和一个 filter 部分,然后请求突出显示信息。
文档说在查询上下文或过滤器上下文中使用查询,但荧光笔似乎并没有表示这种区别。
这是我的完整查询:
GET /sample04/_search
{
"query": {
"bool": {
"must": [
{
"query": { "query_string": { "query": "east west" } }
}
],
"filter": [
{
"terms": {"OwnerId": ["1", "2","3"]}
}
]
}
},
"highlight": {
"fields": {
"*": { "require_field_match": "false" }
}
}
}
所以这个查询按预期工作 - 我们正在查询术语 east 或 west,并且我们在 Id 字段上过滤文档,这是我们安全要求的一部分,然后我要求突出显示信息。
然而,缺点是突出显示信息包含我在过滤器中提交的每个值(在本例中为 1、2 或 3)与文档任何部分的任何字段中的任何值相匹配的每个实例,像这样:
"highlight": {
"SomeTextField": [
"North <em>West</em>"
],
"OwnerId": [
"<em>3</em>"
],
"SerialNumber": [
"<em>3</em>-<em>3</em>"
],
"AssociatedValue": [
"<em>3</em>",
"<em>2</em>"
],
"RelatedValue": [
"<em>3</em>",
"<em>3</em>",
"<em>3</em>",
"<em>3</em>",
"<em>3</em>"
]
}
如何让荧光笔与必须部分中的查询相匹配,但忽略过滤器?我相信它应该忽略作为过滤器一部分的突出显示匹配项,特别是当它突出显示包含值的字段时被请求过滤特定字段,但它在我的文档中的任何地方使用该值。这似乎有点不对,但也许这是我的理解。
仅供参考,如果我将 require_field_match 设置为 TRUE,那么我只会获得与过滤器匹配的匹配项,以及与查询匹配的 NONE。
我无法指定一个字段来为其生成突出显示信息,而我们使用 Elastic 作为搜索一次找到任何模型,所以我不知道我的结果将来自哪个字段 return。
你能看出我做错了什么吗?如果能理解这一点,将不胜感激。
您可以使用 highlight query 来达到这个目的。将突出显示部分更改为
"highlight": {
"fields": {
"*": {
"highlight_query": {
"query_string": {
"query": "east west"
}
}
}
}
}
我在 Elastic 2.0 和 2.1 中突出显示时遇到问题 - return它提供的信息比我想象的要多。
我正在构建一个 bool 查询(filtered 查询关键字在 2.0+ 中已弃用,因此我正在尝试更新我的语法)。我正在查询中构建一个 must 部分和一个 filter 部分,然后请求突出显示信息。
文档说在查询上下文或过滤器上下文中使用查询,但荧光笔似乎并没有表示这种区别。
这是我的完整查询:
GET /sample04/_search
{
"query": {
"bool": {
"must": [
{
"query": { "query_string": { "query": "east west" } }
}
],
"filter": [
{
"terms": {"OwnerId": ["1", "2","3"]}
}
]
}
},
"highlight": {
"fields": {
"*": { "require_field_match": "false" }
}
}
}
所以这个查询按预期工作 - 我们正在查询术语 east 或 west,并且我们在 Id 字段上过滤文档,这是我们安全要求的一部分,然后我要求突出显示信息。
然而,缺点是突出显示信息包含我在过滤器中提交的每个值(在本例中为 1、2 或 3)与文档任何部分的任何字段中的任何值相匹配的每个实例,像这样:
"highlight": {
"SomeTextField": [
"North <em>West</em>"
],
"OwnerId": [
"<em>3</em>"
],
"SerialNumber": [
"<em>3</em>-<em>3</em>"
],
"AssociatedValue": [
"<em>3</em>",
"<em>2</em>"
],
"RelatedValue": [
"<em>3</em>",
"<em>3</em>",
"<em>3</em>",
"<em>3</em>",
"<em>3</em>"
]
}
如何让荧光笔与必须部分中的查询相匹配,但忽略过滤器?我相信它应该忽略作为过滤器一部分的突出显示匹配项,特别是当它突出显示包含值的字段时被请求过滤特定字段,但它在我的文档中的任何地方使用该值。这似乎有点不对,但也许这是我的理解。
仅供参考,如果我将 require_field_match 设置为 TRUE,那么我只会获得与过滤器匹配的匹配项,以及与查询匹配的 NONE。
我无法指定一个字段来为其生成突出显示信息,而我们使用 Elastic 作为搜索一次找到任何模型,所以我不知道我的结果将来自哪个字段 return。
你能看出我做错了什么吗?如果能理解这一点,将不胜感激。
您可以使用 highlight query 来达到这个目的。将突出显示部分更改为
"highlight": {
"fields": {
"*": {
"highlight_query": {
"query_string": {
"query": "east west"
}
}
}
}
}