Elasticsearch - 如何猜测查询中的重要单词?

时间:2016-07-16 07:02:48

标签: elasticsearch full-text-search precision booleanquery

假设我们在可用职位位置索引上执行如下所示的两个查询:

  • PHP Developer
  • Ruby Developer

执行简单的布尔 AND 查询时,由于缺少开发人员的存在,将排除 PHP Programmer 等位置。当为 PHP Developer 执行 OR 布尔查询时,包含 Ruby开发人员的文档也将包含在结果中。

PHP开发人员 PHP 这一短语中检测到这一点的最佳方法是什么?开发人员更重要?

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

3 个答案:

答案 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;将获得最高分。