假设我们正在对可用职位索引执行两个查询,如下所示:
- PHP 开发人员
- 红宝石开发人员
当执行简单的布尔AND查询时,像PHP Programmer这样的职位将被排除在外,因为缺少developer。当对包含Ruby 开发者的PHP 开发者文档执行OR布尔查询时,结果中也将包含该文档。
在PHP Developer中检测到PHP比Developer更重要的最佳方法是什么?
因此,当对PHP Developer执行搜索时,PHP术语必须出现在结果中,但Developer部分只会增加分数。
假设我们正在对可用职位索引执行两个查询,如下所示:
当执行简单的布尔AND查询时,像PHP Programmer这样的职位将被排除在外,因为缺少developer。当对包含Ruby 开发者的PHP 开发者文档执行OR布尔查询时,结果中也将包含该文档。
在PHP Developer中检测到PHP比Developer更重要的最佳方法是什么?
因此,当对PHP Developer执行搜索时,PHP术语必须出现在结果中,但Developer部分只会增加分数。
您可以使用常规“匹配”查询并添加“截止频率”参数。喜欢:
{
"query": {
"match": {
"<field_name>": {
"query": "PHP Developer",
"operator": "AND",
"cutoff_frequency": 0.001
}
}
}
}
这样,出现在少于 0.1% 的文档中的每个术语 - 将被视为“重要”并且将是“必须”,而其他术语将不是“必须”,而只会增加分数。“开发人员”将比“PHP”更常见,因此“PHP”将是必须的,但“开发人员”将是可选的,但评级更高。请注意,“PHP”可能仍然很常见,因此您确实需要微调正确的频率!
我不认为有一个简单的答案。根据您拥有的诸如开发人员之类的术语的数量,您可以执行诸如 Boosting 查询之类的操作。您必须从搜索查询中过滤术语并创建 Boosting 查询。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html
更好的方法可能是使用常用术语查询。在这里,您可以给出许多文档中的术语,“高频”术语,不太重要。将low_freq_operator与 AND 结合使用可以帮助您完成您想要完成的任务。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-common-terms-query.html
您可以对字段使用自定义分析器,以使字段的标记始终保持一致。在这种情况下,您可以在停用词列表中使用“停止”类型的标记过滤器(停用词过滤器)和“开发者”(以及应有效忽略的任何其他内容)。这将在索引时应用于查询和数据,因此如果索引中有“PHP Developer”,查询中有“PHP”,它们都将变成“PHP”的标记,因此它们将是完全匹配。
为了使这对键入“开发者”的不同方式更加健壮,您可能还希望使用“小写”标记过滤器,因此停用词将改为“开发者”。
您应该注意这将需要重新索引数据。
设置文件最终会是这样的:
{
"analysis": {
"filter": {
"job_stopwords": {
"type": "stop",
"stopwords": [
"developer", "dev"
]
}
},
"analyzer": {
"job_analyzer": {
"type": "custom",
"filter": [
"lowercase", "job_stopwords"
]
}
}
}
然后,您需要将 job_analyzer 分析器应用于文档映射中的作业字段。
要让“开发者”增加命中的分数,您可以在该字段的映射上添加一个子字段,该字段使用默认分析器。然后,您可以“必须”job_analyzer 并“应该”默认分析版本。
您的映射将如下所示:
{
"job_posting": {
"properties": {
"job_type": {
"type": "string",
"analyzer": "job_analyzer",
"fields": {
"default": {
"type": "string"
}
}
}
}
}
}
您的查询将是这样的:
{
"query": {
{
"bool": {
"must": {
"match": {
"job_type" : "PHP Developer"
}
},
"should": {
"match": {
"job_type.default" : "PHP Developer"
}
}
}
}
}
}
哪个将匹配“PHP Developer”、“php dEv”和“PHP”,但“PHP Developer”将获得最高分。