1

假设我们正在对可用职位索引执行两个查询,如下所示:

  • PHP 开发人员
  • 红宝石开发人员

当执行简单的布尔AND查询时,像PHP Programmer这样的职位将被排除在外,因为缺少developer当对包含Ruby 开发者的PHP 开发者文档执行OR布尔查询时,结果中也将包含该文档。

在PHP Developer中检测到PHPDeveloper更重要的最佳方法是什么?

因此,当对PHP Developer执行搜索时,PHP术语必须出现在结果中,但Developer部分只会增加分数。

4

3 回答 3

3

您可以使用常规“匹配”查询并添加“截止频率”参数。喜欢:

{
     "query": {
           "match": {
                "<field_name>": {
                      "query": "PHP Developer",
                      "operator": "AND",
                      "cutoff_frequency": 0.001
                }                
           }
     }
}

这样,出现在少于 0.1% 的文档中的每个术语 - 将被视为“重要”并且将是“必须”,而其他术语将不是“必须”,而只会增加分数。“开发人员”将比“PHP”更常见,因此“PHP”将是必须的,但“开发人员”将是可选的,但评级更高。请注意,“PHP”可能仍然很常见,因此您确实需要微调正确的频率!

于 2016-07-17T19:58:21.657 回答
1

我不认为有一个简单的答案。根据您拥有的诸如开发人员之类的术语的数量,您可以执行诸如 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

于 2016-07-16T07:25:51.687 回答
0

您可以对字段使用自定义分析器,以使字段的标记始终保持一致。在这种情况下,您可以在停用词列表中使用“停止”类型的标记过滤器(停用词过滤器)和“开发者”(以及应有效忽略的任何其他内容)。这将在索引时应用于查询和数据,因此如果索引中有“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”将获得最高分。

于 2016-07-21T09:57:50.150 回答