我开发了一个thesaurus of job titles,我试图把它变成一种与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.)我可以将“安全工程师”也编入索引为“信息安全”。我会将“Information Security”的同义词添加到search_analyzer中,因此它会搜索“Information Security”一词。
索引时的示例:
"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“。)