我正在创建一个搜索引擎,用户可以选择搜索确切的字词,如果他们想要使用引用。例如,搜索"foo" bar
将在"foo"
的所有字段中完全匹配。
我使用multi_match
部分使用此功能但我无法指定匹配术语的顺序:
{
"index": [],
"body": {
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "foo",
"operator": "and"
}
}
],
"should": [
...
]
}
}
}
}
这是不可取的,因为我无法指定维持术语的顺序。例如,我尝试完全匹配"foo bar"
,然后返回在其中一个字段中保留"bar foo"
的结果。
关于should
,查询可能会也可能不会在此处,具体取决于用户搜索的内容,但这是标准的查询字符串查询/匹配。
我现在希望使用filter
,因为它是Elasticsearch recommends。我当前的查询(取自示例)是:
{
"index": [],
"body": {
"query": {
"constant_score": {
"filter": [
{
"term": {
"_all": "foo"
}
}
]
},
"match_all": {}
}
}
}
filter
是一个数组,因为用户可以指定在多个不同的术语/短语上进行精确匹配。例如,搜索"foo bar" hello "world"
会产生如下内容:
"filter": [
{
"term": {
"_all": "foo bar"
}
},
{
"term": {
"_all": "world"
}
}
]
我得到的错误是[parsing_exception] unexpected token [START_ARRAY], with { line=1 & col=38 }
。完整的堆栈跟踪如下:
我不确定是否需要match_all
,我只是把它扔在那里,因为我没有得到任何输出。