3

我对弹性搜索很陌生。我有一个弹性搜索查询,它根据关键字返回数据库中存在的所有用户,但在这里我只需要获取活动状态为真的用户,但现在我正在获取所有用户列表。

我已经建立了一个搜索查询

    {
        "from" : 0,
        "size" : 30,
        "query" : {
            "query_string" : {
                "query" : "*jhon*",
                "default_field" : "_all"
            }
        },
        "sort" : [ 
            {
                "id" : {
                    "order" : "desc"
                }
            }
        ]
    }

我正在使用类似的查询*jhon*,但我需要得到类似用户名的结果,jhon并且他的活动状态应该是真实的,所以我已经尝试过*"+jhon+"\*"#activated~true",但我没有得到想要的结果。我不知道我做错了什么。

4

1 回答 1

8

最好在查询中添加过滤器。过滤器更快,因为它们不涉及任何评分并且被缓存。您可以使用不同的过滤器,elasticsearch 查询 DSL 非常灵活。过滤器的类型取决于您索引数据的方式,这取决于您的数据。我将假设最简单的解决方案:一个term filter。看看下面的例子。

{
    "from" : 0,
    "size" : 30,
    "query" : {
        "query_string" : {
            "query" : "*jhon*",
            "default_field" : "_all"
        }
    },
    "filter" : {
        "term" : { 
            "activated" : "true" 
        }
    },
    "sort" : [ 
        {
            "id" : {
                "order" : "desc"
            }
        }
    ]
}

请注意,搜索时应用过滤器的方法有多种。在我的示例中,我应用了一个顶级过滤器,该过滤器将仅应用于搜索结果,而不应用于构面。如果您也希望将其应用于构面,您应该查看过滤后的查询;而不是添加过滤器,您会将当前查询包装到新的过滤查询中,该查询也可以包含相同的术语过滤器。

于 2013-04-15T18:41:19.127 回答