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

标签 elasticsearch elasticsearch-java-api elasticsearch-query

我正在尝试编写Elasticsearch多重匹配查询(使用Java API)以创建“按类型搜索”程序。该查询将应用于两个字段titledescription,它们被分析为ngrams。

我的问题是,Elasticsearch似乎尝试像我的查询一样仅查找从到的单词。例如,如果我搜索“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%")

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

最佳答案

那是因为您使用的是 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"
                  ]
                }
            }
        }
    }
}

关于elasticsearch - 为什么我的Elasticsearch多重匹配查询仅查找前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45189677/

相关文章:

azure - Logstash azure 插件

Elasticsearch - 启用字段的全文搜索

c# - 将查询添加到字段时,NEST Elasticsearch空响应

elasticsearch - 如何在Elastic Search中增加具有动态属性的嵌套对象?

elasticsearch - ElasticSearch查询带有聚合前缀

elasticsearch - Elasticsearch查询,它返回所有内容或找到的匹配项

elasticsearch - 获取elasticsearch中每个匹配项的 `n`记录

elasticsearch - 如何通过 JSON 将查询设置为 Elasticsearch SearchRequest?

java - Elasticsearch 子聚合 tophits JAVA API 无法正常工作

elasticsearch - 无法使用Java API和Shield连接到ElasticSearch服务器