术语数组上的ElasticSearch过滤器将过滤掉所有术语

时间:2015-03-30 09:39:46

标签: filter elasticsearch

在我的应用程序中,用户属于角色列表,对象具有与其关联的角色列表以确定可见性。我尝试创建一个查询,确保用户属于该对象所需的至少一个组。

这是我的索引配置:

{
    "settings": {
        "analysis": {
            "filter": {
                "nGram_filter": {
                    "type": "nGram",
                    "min_gram": 2,
                    "max_gram": 12,
                    "token_chars": []
                }
            },
            "analyzer": {
                "nGram_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "nGram_filter"
                    ]
                },
                "whitespace_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        }
   },
    "mappings": {
        "team" : {
            "dynamic": "strict",
            "properties" : {
                "id": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "object": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "roles": {
                    "type": "string",
                    "index": "not_analyzed"
                },
                "name": {
                    "type": "string",
                    "index_analyzer": "nGram_analyzer",
                    "search_analyzer": "whitespace_analyzer"
                },
                "text": {
                    "type": "string",
                    "index_analyzer": "nGram_analyzer",
                    "search_analyzer": "whitespace_analyzer"
                }
            }
        }
    }
}

以下是我编入索引的一些示例数据: (通过localhost验证:9200 / index / _search?q = name:employee_1& pretty)

{
    "id":"lsJ17K4sgQVfd",
    "roles: ["OwnerslsJ17K21px6VX","AdminslsJ17K21px6VX"],
    "object":"contact",
    "name":"employee_1",
    "text":"lsJ17K4sgQVfd employee_1 employee_1 employee_1@lsj17k1nysk75.com"
}

这是我的查询,我正在尝试执行以查找相同的联系人:

{
    "_source": ["id", "object", "name"],
    "size": 30,
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "should": {
                        "multi_match": {
                            "query": "employee_1",
                            "type": "cross_fields",
                            "operator": "or",
                            "fields": ["name^2", "text"],
                            "minimum_should_match": "50%",
                            "fuzziness": "AUTO"
                        }
                    },
                    ...,
                    "minimum_should_match": 1
                }
            },
            "filter": {
                "terms": {
                    "roles": [ "AdminslsJ17K21px6VX", "lsJ17K3gHCH4P" ]
                }
            }
        }
    },
    "suggest": {
        "text": "employee_1",
        "text_suggestion": {
            "term": {
                "size": 3,
                "field": "name",
                "sort": "score",
                "suggest_mode": "missing",
                "prefix_length": 1
            }
        }
    }
}

如果我删除filter子句,那么我会得到结果,但是一旦我将其添加回来,所有内容都会被删除。表达我希望结果至少有一个共同角色的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

上面的查询按预期工作,唯一的问题是我的测试用例在索引完全填充之前执行。在进行第一次查询之前添加一个短暂的等待时间就解决了这个问题。

相关问题