使用过滤器

时间:2018-06-06 11:52:28

标签: elasticsearch

我正在创建一个搜索引擎,用户可以选择搜索确切的字词,如果他们想要使用引用。例如,搜索"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 }。完整的堆栈跟踪如下:

enter image description here

我不确定是否需要match_all,我只是把它扔在那里,因为我没有得到任何输出。

0 个答案:

没有答案