【问题标题】:Elasticsearch lowercase filter searchElasticsearch 小写过滤器搜索
【发布时间】:2014-09-08 18:42:27
【问题描述】:

我正在尝试搜索我的数据库并能够使用大写/小写过滤器术语,但我注意到在 query 的应用分析器时,我无法弄清楚如何在过滤搜索。这是查询:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [
                        {
                            "term": {
                                "language": "mandarin" // Returns a doc
                            }
                        },
                        {
                            "term": {
                                "language": "Italian" // Does NOT return a doc, but will if lowercased
                            }
                        }
                    ]
                }
            }
        }
    }
}

我有一个 languages 类型,我使用小写:

"analyzer": {
    "lower_keyword": {
        "type": "custom",
        "tokenizer": "keyword",
        "filter": "lowercase"
    }
}

以及对应的映射:

"mappings": {
    "languages": {
        "_id": {
            "path": "languageID"
        },
        "properties": {
            "languageID": {
                "type": "integer"
            },
            "language": {
                "type": "string",
                "analyzer": "lower_keyword"
            },
            "native": {
                "type": "string",
                "analyzer": "keyword"
            },
            "meta": {
                "type": "nested"
            },
            "language_suggest": {
                "type": "completion"
            }
        }
    }
}

【问题讨论】:

    标签: search elasticsearch


    【解决方案1】:

    问题是您有一个在索引期间分析过的字段以将其小写,但是您对未分析的查询使用了术语过滤器:

    词条过滤器

    过滤具有包含术语(未分析)的字段的文档。 类似于术语查询,只是它充当过滤器。

    http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html

    我会尝试使用查询过滤器:

    查询过滤器

    包装任何要用作过滤器的查询。可以放在查询中 接受过滤器。

    例子:

    {
        "constantScore" : {
            "filter" : {
                "query" : {
                    "query_string" : {
                        "query" : "this AND that OR thus"
                    }
                }
            }
        } }
    

    http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-filter.html#query-dsl-query-filter

    【讨论】:

    • 那么,如果我想将术语小写,我是否会将标记器更改为小写并重新索引所有内容?
    • 不,由于小写过滤器,它在索引期间已经小写。问题是您需要使用也可以分析的查询类型 - 术语过滤器不需要。
    • 如果您只是将输入小写以便您可以继续使用术语过滤器而不是使用查询过滤器,您会看到更好的性能吗?
    【解决方案2】:

    这可以通过将.keyword 附加到您的字段来查询该字段的关键字版本来实现。假设语言在映射中定义为keyword

    请注意,现在只有准确的文本会匹配:mandarin 不会匹配,Italian 会匹配。

    您的查询最终会是这样的:

    {
        "query": {
            "filtered": {
                "filter": {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "language.keyword": "mandarin" // Returns Empty
                                }
                            },
                            {
                                "term": {
                                    "language.keyword": "Italian" // Returns Italian.
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
    

    也允许组合术语值:

    {
        "query": {
            "filtered": {
                "filter": {
                    "bool": {
                        "should": [
                            {
                                "term": {
                                    "language.keyword":
                                         ["mandarin", "Italian"]
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2021-08-27
      • 2016-10-26
      • 2021-08-23
      • 2016-05-27
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多