ElasticSearch 5将找不到包含空格

时间:2017-01-15 16:57:14

标签: elasticsearch querydsl

使用以下格式编制索引文档:

{
"title": "this is the title",
"brand": "brand here",
"filters": ["filter1", "filter2", "Sin filters", "Camera IP"]
"active": true
}

然后查询如下:

'query': {
            'function_score': {
                'query': {
                    'bool': {
                        'filter': [
                            {
                                'term': {
                                    'active': True
                                }
                            }
                        ],
                        'must': [
{
                                'terms': {
                                    'filters': ['camera ip']

                                }
                            }
                        ]
                    }
                }
            }
        }

我无法使用“Camera IP”过滤器(或此字符串的任何变体,小写等)返回任何文档,但Es返回带过滤器的文件:“Sin过滤器”。

使用以下设置创建索引。请注意,“过滤器”字段将属于默认模板,类型为关键字

"settings":{
         "index":{
            "analysis":{
                "analyzer":{
                    "keylower":{
                        "tokenizer":"keyword",
                        "filter":"lowercase"
                    }
                }
            }
         }
    },
    "mappings": {

        "_default_": {
            "dynamic_templates": [
                {
                    "string_as_keywords": {
                        "mapping": {
                            "index": "not_analyzed",
                            "type" : "keyword",
                            **"analyzer": "keylower"** # I also tried with and without changing this analyzer
                            },
                        "match": "*",
                        "match_mapping_type": "string"
                    }
                },
                {
                    "integers": {
                        "mapping": {
                            "type": "integer"
                        },
                        "match": "*",
                        "match_mapping_type": "long"
                    }
                },
                {
                    "floats": {
                        "mapping": {
                            "type": "float"
                        },
                        "match": "*",
                        "match_mapping_type": "double"
                    }
                }
            ]
        }
}

我缺少什么?奇怪的是它返回那些带有“Sin过滤器”过滤器而不是“Camera IP”。

感谢。

2 个答案:

答案 0 :(得分:2)

您似乎希望过滤器为小写而不是标记化。我认为您的查询的问题是您将字符串的类型设置为"关键字" ES不会分析这些字段,甚至不会改变它们的情况:

  

关键字字段只能按其确切值进行搜索。

这就是为什么使用您的设置仍然可以使用如下查询检索文档:{"query": {"term": {"filters": "Camera IP"}}}'

由于您希望分析器在编制索引之前更改文本的大小写,因此您应将类型设置为text,方法是将映射更改为以下内容:

{"settings":{
  "index": {
        "analysis":{
            "analyzer":{
                "test_analyzer":{
                    "tokenizer":"keyword",
                    "filter":"lowercase"
                }
            }
        }
     }
  },
  "mappings": {
    "_default_": {
        "dynamic_templates": [
            {
                "string_as_keywords": {
                    "mapping": {
                        "type": "text",
                        "index": "not_analyzed",
                        "analyzer": "test_analyzer"
                        },
                    "match": "*",
                    "match_mapping_type": "string"
                }
            }
        ]
    }
}}

答案 1 :(得分:0)

您的过滤器'filters': ['camera ip']会查找camera ip,而在映射中,您将字段filters作为keyword类型,其中elasticsearch会查找完全匹配。因此,为了找到该字段,您需要具有为匹配索引的精确字符串。如果您的用例不需要完全匹配,请将类型更改为text,弹性搜索在索引之前进行分析。有关文本数据类型here和关键字数据类型here

的更多信息