我不是很擅长Elasticsearch。我试图在我的应用程序中设置搜索,遇到了一些奇怪的问题。我有两个文档:
{
"title": "Second insight"
"content": "Bla bla bla"
"library": "workspace"
}
{
"title": "Test source"
"content": "Bla bla bla"
"library": "workspace"
}
然后,我希望能够通过title
和content
等文本字段进行搜索,并在library
等字段上应用一些过滤器。我有一个查询:
{
"query": {
"bool": {
"should": [
{ "match": { "title": "insight" }}
],
"filter": [
{
"term": {
"library": "workspace"
}
}
]
}
}
}
尽管我明确定义了title
与insight
匹配,但上面的查询返回和文件,不只是第一个。
如果我删除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标记器)或使用通配符查询。