elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo),elasticsearch,kibana,nest,stop-words,accent-insensitive,elasticsearch,Kibana,Nest,Stop Words,Accent Insensitive" /> elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo),elasticsearch,kibana,nest,stop-words,accent-insensitive,elasticsearch,Kibana,Nest,Stop Words,Accent Insensitive" />

elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo)

elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo),elasticsearch,kibana,nest,stop-words,accent-insensitive,elasticsearch,Kibana,Nest,Stop Words,Accent Insensitive,我正在尝试创建一个索引,该索引被配置为忽略重音和pt br stopwords,并允许在高亮度查询中分析多达40mi的字符 我可以使用以下代码创建这样的索引: var createIndexResponse = client.Indices.Create(indexName, c => c .Settings(s => s .Setting("highlight.max_analyzed_offset" , 40000000) .Analysi

我正在尝试创建一个索引,该索引被配置为忽略重音和pt br stopwords,并允许在高亮度查询中分析多达40mi的字符

我可以使用以下代码创建这样的索引:

var createIndexResponse = client.Indices.Create(indexName, c => c
    .Settings(s => s
        .Setting("highlight.max_analyzed_offset" , 40000000)
        .Analysis(analysis => analysis
            .TokenFilters(tokenfilters => tokenfilters
                .AsciiFolding("folding-accent", ft => ft
                )
                .Stop("stoping-br", st => st
                    .StopWords("_brazilian_")
                )
            )
            .Analyzers(analyzers => analyzers
                .Custom("folding-analyzer", cc => cc
                    .Tokenizer("standard")
                    .Filters("folding-accent", "stoping-br")
                )
            )
        )
    )
    .Map<Noticia>(mm => mm
        .AutoMap()
        .Properties(p => p
            .Text(t => t
                .Name(n => n.Conteudo)
                .Analyzer("folding-analyzer")
            )
        )
    )
);
结果:

{
  "tokens" : [
    {
      "token" : "Ferias",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "funcionarios",
      "start_offset" : 19,
      "end_offset" : 31,
      "type" : "<ALPHANUM>",
      "position" : 4
    }
  ]
}
然而,如果我使用NEST ElasticSearch.NET客户端执行搜索,像“Férias”(带重音)和“Ferias”(不带重音)这样的词被视为不同的词

我的目标是执行一个返回所有结果的查询,不管单词是Férias还是Ferias

这就是我用来查询elasticsearch的简化代码(C#nest):

var searchResponse = ElasticClient.Search<Noticia>(s => s
    .Index(indexName)
    .Query(q => q
    .MultiMatch(m => m
                .Fields(f => f
                    .Field(p => p.Titulo,4)
                    .Field(p => p.Conteudo,2)
                )
                .Query(termo)
            )
    )
);
我还尝试在查询中使用多字段和后缀,但没有成功

.Map<Noticia>(mm => mm
    .AutoMap()
    .Properties(p => p
        .Text(t => t
        .Name(n => n.Conteudo)
        .Analyzer("folding-analyzer")
        .Fields(f => f
            .Text(ss => ss
                .Name("folding")
                .Analyzer("folding-analyzer")
                )
        )

(...)

var searchResponse = ElasticClient.Search<Noticia>(s => s
    .Index(indexName)   
    .Query(q => q
    .MultiMatch(m => m
        .Fields(f => f
        .Field(p => p.Titulo,4)
        .Field(p => p.Conteudo.Suffix("folding"),2)       
                )
                .Query(termo)
            )
    )
);
.Map(mm=>mm
.AutoMap()
.Properties(p=>p
.Text(t=>t
.Name(n=>n.Conteudo)
.分析器(“折叠分析器”)
.Fields(f=>f
.Text(ss=>ss
.名称(“折叠”)
.分析器(“折叠分析器”)
)
)
(...)
var searchResponse=ElasticClient.Search(s=>s
.Index(索引名)
.Query(q=>q
.MultiMatch(m=>m
.Fields(f=>f
.Field(p=>p.Titulo,4)
.Field(p=>p.Conteudo.后缀(“折叠”),2)
)
.查询(termo)
)
)
);
有没有线索表明我做错了什么,或者我能做些什么来达到我的目标


提前多谢!

几天后,我发现我做错了什么,这一切都与映射有关

以下是我处理问题并最终解决问题的步骤

1-首先,我打开了kibana控制台,发现只有映射字段的最后一个字段被分配给了我的自定义分析器(折叠分析器)

要测试每个字段,可以使用GET FIELD MAPPING API和开发工具中的命令,如下所示:

GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
        .AutoMap()
        .Properties(p => p
            .Text(t => t
                .Name(n => n.Field1)
                .Analyzer("folding-analyzer")
            )
            .Text(t => t
                .Name(n => n.Field2)
                .Analyzer("folding-analyzer")
            )
            .Object<NoticiaArquivo>(o => o
                .Name(n => n.Arquivos)
                .Properties(eps => eps
                    .Text(s => s
                        .Name(e => e.NAField1)
                        .Analyzer("folding-analyzer")
                    )
                    .Text(s => s
                        .Name(e => e.NAField2)
                        .Analyzer("folding-analyzer")
                    )
                )
            )
        )
    )
GET/\u映射/字段/
然后你就可以看到你的分析仪是否被分配到你的领域

2-之后,我发现最后一个字段是唯一分配给我的自定义分析器的字段,原因是我在两个方面搞乱了fluent映射:

  • 首先,我必须正确地链接我的文本属性
  • 其次,我试图在另一个map子句中映射另一个POCO类,当时我应该使用Object子句
对我有效的正确映射有点像这样:

GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
        .AutoMap()
        .Properties(p => p
            .Text(t => t
                .Name(n => n.Field1)
                .Analyzer("folding-analyzer")
            )
            .Text(t => t
                .Name(n => n.Field2)
                .Analyzer("folding-analyzer")
            )
            .Object<NoticiaArquivo>(o => o
                .Name(n => n.Arquivos)
                .Properties(eps => eps
                    .Text(s => s
                        .Name(e => e.NAField1)
                        .Analyzer("folding-analyzer")
                    )
                    .Text(s => s
                        .Name(e => e.NAField2)
                        .Analyzer("folding-analyzer")
                    )
                )
            )
        )
    )
.Map(mm=>mm
.AutoMap()
.Properties(p=>p
.Text(t=>t
.Name(n=>n.Field1)
.分析器(“折叠分析器”)
)
.Text(t=>t
.Name(n=>n.Field2)
.分析器(“折叠分析器”)
)
.Object(o=>o
.Name(n=>n.Arquivos)
.Properties(eps=>eps
.Text(s=>s
.Name(e=>e.NAField1)
.分析器(“折叠分析器”)
)
.Text(s=>s
.Name(e=>e.NAField2)
.分析器(“折叠分析器”)
)
)
)
)
)
最后,重要的是,当您使用.Analyzer(“analiserName”)子句分配分析器时,您告诉elastic search您希望将参数分析器用于索引和搜索

如果只想在搜索时而不是索引时使用分析器,则应使用.SearchAnalyzer(“analiserName”)子句

GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
        .AutoMap()
        .Properties(p => p
            .Text(t => t
                .Name(n => n.Field1)
                .Analyzer("folding-analyzer")
            )
            .Text(t => t
                .Name(n => n.Field2)
                .Analyzer("folding-analyzer")
            )
            .Object<NoticiaArquivo>(o => o
                .Name(n => n.Arquivos)
                .Properties(eps => eps
                    .Text(s => s
                        .Name(e => e.NAField1)
                        .Analyzer("folding-analyzer")
                    )
                    .Text(s => s
                        .Name(e => e.NAField2)
                        .Analyzer("folding-analyzer")
                    )
                )
            )
        )
    )