gpt4 book ai didi

elasticsearch ngram 分析器/tokenizer 不工作?

转载 作者:行者123 更新时间:2023-11-29 02:55:16 24 4
gpt4 key购买 nike

似乎 ngram 分词器不工作或者我对它的理解/使用不正确。

我的分词器正在处理 mingram of 3 和 maxgram of 5。我正在寻找术语“madonna”,它肯定在我的文档中的 artists.name 下。我可以使用其他技术(使用简单的分析器和相关工具)找到该术语,但不能使用 ngram。

我试图通过使用 ngram 来完成的是查找名称并解释拼写错误。

请查看我的映射、我的设置和我的查询的简化版本,如果您有任何想法,请告诉我 - 这让我抓狂!

设置...

{
"myindex": {
"settings": {
"index": {
"analysis": {
"analyzer": {
"ngramAnalyzer": {
"type": "custom",
"filter": [
"lowercase"
],
"tokenizer": "nGramTokenizer"
}
},
"tokenizer": {
"nGramTokenizer": {
"type": "nGram",
"min_gram": "3",
"max_gram": "5"
}
}
},
"number_of_shards": "5",
"number_of_replicas": "1",
"version": {
"created": "1020199"
},
"uuid": "60ggSr6TREaDTItkaNUagg"
}
}
}
}

映射 ...

{
"myindex": {
"mappings": {
"mytype": {
"properties": {
"artists.name": {
"type": "string",
"analyzer": "simple",
"fields": {
"ngram": {
"type": "string",
"analyzer": "ngramAnalyzer"
},
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
}

查询...

{"query": {"match": {"artists.name.ngram": "madonna"}}}

文件...

{
"_index": "myindex",
"_type": "mytype",
"_id": "602537592951",
"_version": 1,
"found": true,
"_source": {
"artists": [
{
"name": "Madonna",
"id": "P 64565"
}
]
}
}

编辑顺便说一句,这个查询有效(没有 ngram):

{"query": {"match": {"artists.name": "madonna"}}}

这显然与这里的嵌套对象有关。我显然没有正确地将 ngram 应用于嵌套对象。

想法?

最佳答案

好的 - 我想通了。我真的希望这对某人有所帮助,因为它让我发疯。

这是我的映射结果的样子:

{
"myindex": {
"mappings": {
"mytype": {
"properties": {
"artists": {
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"analyzer": "ngramAnalyzer",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
}
}

这是我如何使用 Nest 语法完成的...

首先我有一个名为 Person 的子类型(类),它有一个 Name 和 Id,看起来像这样 (POCO)...

[Serializable]
public class Person
{
public string Name { get; set; }
[ElasticProperty(Analyzer = "fullTerm", Index = FieldIndexOption.not_analyzed)]
public string Id { get; set; }
}

然后我的映射变成了这样......

.AddMapping<MyIndex>(m => m
.MapFromAttributes()
.Properties(props =>
{
props
.Object<Person>(x => x.Name("artists")
.Properties(pp => pp
.MultiField(
mf => mf
.Name(s => s.Name)
.Fields(f => f
.String(s => s.Name(o => o.Name).Analyzer("ngramAnalyzer"))
.String(s => s.Name(o => o.Name.Suffix("raw")).Index(FieldIndexOption.not_analyzed))
)
)
)
)
)

注意:此处的对象表示它是我的类型“艺术家”下的另一个对象。

谢谢我!!!

edit: curl mappings might be something like this...

curl-XPOST"http://localhost:9200/yourindex/_mappings"-H'Content-Type:application/json'-d'{"myindex":{"mappings":{"mytype":{"properties":{"artists":{"properties":{"id":{"type":"string"},"name":{"type":"string","analyzer":"ngramAnalyzer","fields":{"raw":{"type":"string","index":"not_analyzed"}}}}}}}}}}'

关于elasticsearch ngram 分析器/tokenizer 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290151/

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