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