Elasticsearch 布尔查询不适用于过滤器



我不是很擅长Elasticsearch。我试图在我的应用程序中设置搜索,遇到了一些奇怪的问题。我有两个文档:

{
"title": "Second insight"
"content": "Bla bla bla"
"library": "workspace"
}
{
"title": "Test source"
"content": "Bla bla bla"
"library": "workspace"
}

然后,我希望能够通过titlecontent等文本字段进行搜索,并在library等字段上应用一些过滤器。我有一个查询:

{
"query": {
"bool": { 
"should": [
{ "match": { "title": "insight" }}
],
"filter": [
{
"term": {
"library": "workspace"
}
}
]
}
}
}

尽管我明确定义了titleinsight匹配,但上面的查询返回文件,不只是第一个。

如果我删除filter块:

{
"query": {
"bool": { 
"should": [
{ "match": { "title": "insight" }}
]
}
}
}

查询返回正确的结果。

然后,我也试着做一个部分搜索。由于某些原因,查询使用ins而不是下面的insight不起作用,因此,它返回空列表:

{
"query": {
"bool": { 
"should": [
{ "match": { "title": "ins" }}
]
}
}
}

如何进行部分搜索?我怎样才能正确设置过滤器?换句话说,如何通过某些字段进行搜索部分查询,但同时通过其他字段进行过滤?

谢谢。

您需要在第一个查询中提供minimum_should_match

我做了以下操作,只得到一个文档(你想要的结果)

POST test_things/_search
{
"query": {
"bool": {
"minimum_should_match": 1, 
"should": [
{
"match": {
"title": "insight"
}
}
],
"filter": [
{
"term": {
"library": "workspace"
}
}
]
}
}
}

至于为什么ins不起作用,这取决于您正在使用的映射+分析器。您正在匹配索引中的分析项,如果您想匹配ins,则需要更改分析器(可能使用ngram标记器)或使用通配符查询。

相关内容

最新更新