【问题标题】:Why does my Elasticsearch multi-match query look only for prefixes?为什么我的 Elasticsearch 多重匹配查询只查找前缀?
【发布时间】:2017-07-19 11:49:50
【问题描述】:

我正在尝试编写一个 Elasticsearch 多重匹配查询(使用 Java API)来创建一个“搜索即输入”程序。该查询应用于titledescription这两个字段,它们被分析为ngram。

我的问题是,Elasticsearch 似乎只尝试查找 beginning 类似我的查询的词。例如,如果我搜索“nut”,那么它会匹配具有“nut”、“nuts”、“Nutella”的文档,等,但它不匹配具有“walnut”的文档,应该匹配。

这是我的设置:

{
    "index": {
        "analysis": {
            "analyzer": {
                "edgeNGramAnalyzer": {
                    "tokenizer": "edgeTokenizer",
                    "filter": [
                        "word_delimiter",
                        "lowercase",
                        "unique"
                    ]
                }
            },
            "tokenizer": {
                "edgeTokenizer": {
                  "type": "edgeNGram",
                  "min_gram": "3",
                  "max_gram": "8",
                  "token_chars": [
                    "letter",
                    "digit"
                  ]
                }
            }
        }
    }
}

这是我的映射的相关部分:

{
    "content": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "edgeNGramAnalyzer",
                "fields": {
                    "sort": { 
                        "type": "keyword"
                    }
                }
            },
            "description": {
                "type": "text",
                "analyzer": "edgeNGramAnalyzer",
                "fields": {
                    "sort": { 
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

这是我的查询:

new MultiMatchQueryBuilder(query).field("title", 3).field("description", 1).fuzziness(0).tieBreaker(1).minimumShouldMatch("100%")

你知道我做错了什么吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-java-api elasticsearch-query


    【解决方案1】:

    那是因为您使用的是 edgeNGram 标记器而不是 nGram 标记器。前者仅索引前缀,而后者将索引前缀、后缀以及数据的子部分。

    将您的分析器定义改为此,它应该可以按预期工作:

    {
        "index": {
            "analysis": {
                "analyzer": {
                    "edgeNGramAnalyzer": {
                        "tokenizer": "edgeTokenizer",
                        "filter": [
                            "word_delimiter",
                            "lowercase",
                            "unique"
                        ]
                    }
                },
                "tokenizer": {
                    "edgeTokenizer": {
                      "type": "nGram",         <---- change this
                      "min_gram": "3",
                      "max_gram": "8",
                      "token_chars": [
                        "letter",
                        "digit"
                      ]
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢!它有效,您为我节省了数小时的调试时间!
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2014-10-21
    • 2017-06-30
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多