我正在尝试将分析器设置为其设置中的索引。
// PUT /customers
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"title": {
"type": "text"
}
},
"dynamic": false
},
"settings": {
"analysis": {
"analyzer": "ik_smart"
}
}
}然后我索引了一些数据。
// POST /customers/_doc
{
"name": "张三",
"title": "工程师"
}
// POST /customers/_doc
{
"name": "李四",
"title": "测试员"
}用ik_smart分析仪进行分析
//GET /customers/_analyze
{
"text": "李四工程师",
"analyzer": "ik_smart"
}
// gets tokens ['李四', '工程师']使用默认分析器
// GET /customers/_analyze
{
"text": "李四工程师"
}
// gets tokens ['李', '四', '工', '程', '师']最后搜索“李四工程师”
// GET /customers/_search
{
"query": {
"bool": {
"must": {
"multi_match": {
"query": "李四工程师",
"operator": "or",
"type": "cross_fields",
"fields": [
"name^10",
"title^7"
],
"analyzer": "ik_smart"
}
}
}
}
}
// gets empty hits如果我把ik_smart分析器放进每个字段
// PUT /customers
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_smart"
},
"title": {
"type": "text",
"analyzer": "ik_smart"
}
},
"dynamic": false
}
}那么请求就能正常工作了。
我怀疑第一个设置没有将分析器应用到索引中的任何字段。
我在这里使用ik_smart插件,它提供了一个ik_smart分析器,因为中文没有分隔字符的空间,ik_smart是一个基于字典的分析器。如果没有ik_smart分析器,任何包含中文单词或句子的数据都将被索引为单个字符。因此,当我在搜索中使用默认分析器时,它也能工作,因为短语李四工程师分解为['李', '四', '工', '程', '师'],并与索引数据匹配。但这并不能提供一个非常准确的相关性。
如果我使用ik_smart分析器进行搜索,就会得到不匹配索引数据的令牌['李四', '工程师']。
那么,为什么settings.analysis.analyzer不像预期的那样工作呢?
如果这个设置没有任何影响的话,它有什么用?
发布于 2022-09-13 08:49:41
如果希望ik_smart成为索引的默认分析器,可以在分析器定义中使用default param设置它,如这官方文档中所解释的那样。
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": { --> Note this
"type": "simple"
}
}
}
}
}https://stackoverflow.com/questions/73699801
复制相似问题