gpt4 book ai didi

使用 NGram Tokenizer 时,ElasticSearch 不遵守最大 NGram 长度

转载 作者:行者123 更新时间:2023-12-02 23:27:08 28 4
gpt4 key购买 nike

我正在使用 Ngram 标记器,我已将 min_length 指定为 3 并将 max_length 指定为 5。但是,即使我尝试搜索长度大于 5 的单词,它仍然会给我结果。它很奇怪,因为 ES 不会用长度索引组合6 ,但我仍然能够检索记录。这里有什么我遗漏的理论吗?如果不是,那么 NGram 的 max_length 究竟有什么意义?以下是我尝试过的映射..

PUT ngramtest
{
"mappings": {
"MyEntity":{
"properties": {
"testField":{
"type": "text",
"analyzer": "my_analyzer"
}
}

}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 5
}
}
}
}
}

将测试实体索引为:
PUT ngramtest/MyEntity/123
{
"testField":"Z/16/000681"

}

并且,这个查询奇怪地产生了结果
GET  ngramtest/MyEntity/_search
{
"query": {
"match": {
"testField": "000681"
}
}
}

我试过这个来“分析”字符串:
POST ngramtest/_analyze
{
"analyzer": "my_analyzer",
"text": "Z/16/000681."
}

如果我错了,有人可以纠正我吗?

最佳答案

这是因为您的分析仪my_analyzer用于索引 搜索。因此,当您搜索 6 个字符的单词时,abcdef ,该词也将在搜索时由您的 ngram 分析器分析并生成标记 abc , abcd , abcde , bcd等,这些将匹配索引标记。

您需要做的是指定您要使用标准分析器为search_analyzer在你的映射中

    "testField":{
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "standard"
}

在删除索引并重新填充它之前,您可以简单地通过指定要在匹配查询中使用的搜索分析器来测试这个理论:
GET ngramtest/MyEntity/_search
{
"query": {
"match": {
"testField": {
"query": "000681",
"analyzer": "standard"
}
}
}
}

关于使用 NGram Tokenizer 时,ElasticSearch 不遵守最大 NGram 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543223/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com