为什么我的Elasticsearch多匹配查询仅查找前缀?

时间:2017-07-19 11:49:51

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

我正在尝试编写一个Elasticsearch多匹配查询(使用Java API)来创建“搜索即用型”程序。该查询将应用于两个字段titledescription,这些字段将作为ngrams进行分析。

我的问题是,似乎Elasticsearch试图找到像我的查询一样的单词开始。例如,如果我搜索“nut”,那么它与“ nut ”,“ nuts ”,“ Nutella ”的文档匹配,等,但它与“核桃”的文件不匹配,应该匹配。

以下是我的设置:

{
    "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%")

你知道我可能做错了什么吗?

1 个答案:

答案 0 :(得分:1)

这是因为您使用了edgeNGram令牌工具而不是nGram令牌。前者仅索引前缀,而后者将索引前缀,后缀以及数据的子部分。

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

---------------------------------------------
Name        | N1           | N2              |
----------------------------------------------
A           | 500          | 300             |
----------------------------------------------
A           | 0            | **200**         |
----------------------------------------------