我开发了一个职位词库,并试图将其转换为适用于 Elasticsearch 的格式。
我的问题:多词重叠同义词
我正在尝试确定多词重叠同义词的解决方案。当我处理一个职位为“信息安全工程师”的工作时,我希望它在索引中添加“信息安全”和“安全工程师”。
以前,我在索引中包含了信息安全的同义词,但我发现它会将“信息安全工程师”索引为“信息安全”,而不会索引“安全工程师”。因此,我从索引中删除了“信息安全”等同义词集。
现在,我正在寻找一种在索引中包含信息安全同义词的方法。
一些可供选择的选项:
1.)我可以添加“信息安全工程师”作为“安全工程师”的同义词,然后将“安全工程师”也索引为“信息安全”。我可以将“信息安全”同义词添加到分析器和搜索分析器中。
索引时的示例:
"synonyms" : [
"security engineer, info security engineer => security_engineer, information_security",
"information security, info security => information_security"
]
搜索时的示例:
"synonyms" : [
"security engineer, info security engineer => security_engineer, information_security",
"information security, info security => information_security"
]
确保“安全工程师”同义词包含所有“信息安全”同义词将难以在整个词库中实施。
2.) 我可以让“安全工程师”也被索引为“信息安全”。我会将“信息安全”的同义词添加到 search_analyzer,因此它会搜索“信息安全”术语。
索引时的示例:
"synonyms" : [
"security engineer => security_engineer, information_security"
]
搜索时的示例:
"synonyms" : [
"security engineer => security_engineer",
"information security, info security => information_security"
]
当有人搜索“信息安全”职位时,它会返回在索引时设置为包含“信息安全”的任何职位。但是,标题中包含诸如“信息安全”之类的短语但在索引时未映射到任何信息安全职位的职位将不会包含在“信息安全”的搜索中。
3.) 我可以将“信息安全”添加到 search_analyzer 并将其扩展到“安全工程师”和任何其他信息安全工作。
索引时的示例:
"synonyms" : [
"security engineer => security_engineer"
]
搜索时的示例:
"synonyms" : [
"security engineer => security_engineer",
"information security, info security => security_engineer, information_security_analyst, penetration_tester"
]
这将在查询处理上投入更多工作,因为它会查找我标记为信息安全工作的所有工作。
4.) 我可以在索引时删除同义词的使用,只在查询时使用同义词。
它将包括职位名称中包含信息安全的所有职位,但不包括任何暗示的职位,例如安全工程师。它还使得处理查询更加耗费资源。
5.) 我可以使用一个索引来表示职称,而使用不同的索引来表示工作职能,例如信息安全。
它将包括所有在职位名称中具有信息安全性的职位,但会错过隐含的职位。它将添加另一个步骤来确定要使用的索引。
你怎么看?
任何建议表示赞赏。我错过了其他选择吗?在查询时或索引时扩展到很多术语是否有问题?
我倾向于选项#2。我正在尝试对其进行设计,以便我的词库易于用于工作搜索引擎和申请人跟踪系统。
背景/当前设置
我创建了一个作业索引,该索引使用包含同义词的分析器和搜索分析器。
curl -XPUT 'http://localhost:9200/jobs/?pretty' -H 'Content-Type: application/json' -d '
{
"settings" : {
"analysis" : {
"filter" : {
"my_job_title_filter_for_index" : {
"type" : "synonym",
"synonyms" : [
"security engineer => security_engineer"
]
},
"my_job_title_filter_for_search" : {
"type" : "synonym",
"synonyms" : [
"security engineer => security_engineer"
]
}
},
"analyzer" : {
"my_job_title_analyzer_for_index" : {
"filter" : [
"standard",
"lowercase",
"stop",
"my_job_title_filter_for_index"
],
"type" : "custom",
"tokenizer" : "standard"
},
"my_job_title_analyzer_for_search" : {
"filter" : [
"standard",
"lowercase",
"stop",
"my_job_title_filter_for_search"
],
"type" : "custom",
"tokenizer" : "standard"
}
}
}
},
"mappings" : {
"job" : {
"properties" : {
"job_title" : {
"type" : "text",
"analyzer" : "my_job_title_analyzer_for_index",
"search_analyzer" : "my_job_title_analyzer_for_search"
}
}
}
}
}
'
我将数据加载到索引中:
curl -XPOST 'http://localhost:9200/jobs/job/_bulk?pretty' -H "Content-Type: application/json" -d'
{"index":{"_id":"1"}}
{"job_title":"Security Engineer"}
{"index":{"_id":"2"}}
{"job_title":"Info Security Engineer"}
'
我查询安全工程师的数据,它返回了两个工作。
curl -XGET 'http://localhost:9200/jobs/job/_search?pretty' -H 'Content-Type: application/json' -d '
{
"query" : {
"match_phrase" : {"job_title" : "security engineer"}
}
}
'
我查询网络安全索引,它没有返回任何结果。
curl -XGET 'http://localhost:9200/jobs/job/_search?pretty' -H 'Content-Type: application/json' -d '
{
"query" : {
"match_phrase" : {"job_title" : "cyber security"}
}
}
'
(旁注:我同时使用分析器和搜索分析器,以便像“SQL DBA”这样的工作被索引为“SQL DBA”和“DBA”。然后,在查询时,搜索“SQL DBA”只搜索“SQL DBA”而不是“DBA”。)