elasticsearch 为什么OpenSearch查询不返回相关结果

xvw2m8pv  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(161)

我 有 一 个 包含 城市 名称 的 索引 。 我 试图 正确 地 给 我 的 条目 打分 , 但是 我 没有 得到 想要 的 结果 。 我 试 着 在 没有 任何 指定 设置 的 情况 下 创建 索引 , 并 使用 了 一 个 edge-n - gram 和 一 个 n - gram 分析 器 。 城市 名称 的 语言 是 德语 , 我 读 的 是 here , 这 应该 是 一 个 很 好 的 分析 器 。 下面 是 我 为 分析 器 尝试 的 设置 :

{
    "settings": {
        "index": {
            "number_of_shards": "1",
            "number_of_replicas": "1"
        },
        "analysis": {
            "analyzer": {
                "e_ngram_token": {
                    "tokenizer": "edge_ngram_tokenizer"
                }
            },
            "tokenizer": {
                "edge_ngram_tokenizer": {
                    "type": "edge_ngram", // exchanged to ngram the other time
                    "min_gram": 2,
                    "max_gram": 10,
                    "token_chars": [
                        "letter",
                        "digit"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }
        }
    }
}

中 的 每 一 个
下面 是 批量 创建 (/cities/_ bulk ) 的 一些 示例 数据 :

{ "create": {  } }
{"name": "Münster"}
{ "create": {  } }
{"name": "München"}
{ "create": {  } }
{"name": "Bad-Münster Fake 2"}
{ "create": {  } }
{"name": "Bad Münster Fake"}
{ "create": {  } }
{"name": "Munddort fake"}
{ "create": {  } }
{"name": "Stolpmünde"}
{ "create": {  } }
{"name": "Swinemünde"}
{ "create": {  } }
{"name": "Dortmund"}
{ "create": {  } }
{"name": "Müden (Mosel)"}
{ "create": {  } }
{"name": "Mannheim"}
{ "create": {  } }
{"name": "Marburg"}
{ "create": {  } }
{"name": "Magdeburg"}
{ "create": {  } }
{"name": "Montreux"}
{ "create": {  } }
{"name": "Sankt Moritz"}

格式
因此 , 当 我 运行 如下 查询 时 :

{
    "from": 0,
    "size": 100,
    "query": {
        "match": {
            "name": {
                "query": "mun",
                "analyzer": "e_ngram_token",
                "fuzziness": "2",
                "fuzzy_transpositions": true,
                "operator":  "or",
                "max_expansions": 50,
                "boost": 5
            }
        }
    }
}

格式
我 希望 得到 像 " München " , " Münster " 等 这样 的 城市 , 基本 上 每个 城市 都 有 " mun " , 或者 , 因为 模糊 性 , 城市 有 " mün " , " man " , " tan " 等 。 我 得到 的 是 这样 的 :

{
    "took": 10,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.0,
        "hits": [
            {
                "_index": "cities",
                "_type": "_doc",
                "_id": "7jX2ioQBc3BSm-EXMB2V",
                "_score": 0.0,
                "_source": {
                    "name": "Bad-Münster Fake 2"
                }
            }
        ]
    }
}

格式
有人 能 给 我 解释 一下 我 遗漏 了 什么 吗 ? 在 我 的 理解 中 , 标记 是 在 索引 时间 创建 的 , 并且 将 类似 于 ' [ " Mü " , " ün " , " nc " ... " Mün " ] 表示 " München " 。 因为 我 要求 模糊 性 为 2 , 术语 " mun " 应该 与 标记 " mün " 匹配 , 从而 返回 结果 。
多谢 了 !

92vpleto

92vpleto1#

您必须在字段中添加分析仪

"name": {
                "type": "text",
                "analyzer": "e_ngram_token" <----------, 
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            }

相关问题