Elasticsearch - 如何猜测查询中的重要单词?
Elasticsearch - How to guess important words in queries?
假设我们在 Available Job positions Index:
上执行如下两个查询
- PHP 开发者
- Ruby 开发者
当执行简单的布尔值 AND 查询位置时,如 PHP Programmer 将被排除,因为缺少 开发者。当对包含 Ruby developer[=39= 的 PHP Developer 文档执行 OR 布尔查询时] 也将包含在结果中。
检测PHP Developer 短语中的最佳方法是什么,PHP 更比 Developer?
重要
因此,在针对 PHP 开发人员 执行搜索时,PHP 术语 必须 出现在结果中,但 Developer 部分只会增加分数。
我认为没有简单的答案。根据开发人员等术语的数量,您可以执行类似 Boosting 查询的操作。您必须过滤搜索查询中的字词并创建提升查询。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html
更好的方法可能是使用常用术语查询。在这里你可以给出很多文档中的术语,"high frequency" 个术语,不太重要。将 low_freq_operator 与 AND 一起使用可以帮助您完成您想要完成的任务。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-common-terms-query.html
您可以使用常规 "match" 查询并添加 "cutoff_frequency" 参数。喜欢:
{
"query": {
"match": {
"<field_name>": {
"query": "PHP Developer",
"operator": "AND",
"cutoff_frequency": 0.001
}
}
}
}
这样,出现在不到 0.1% 的文档中的每个术语都将被视为 "important",并且将是 "must",而其他术语不会是 "must" 但只是增加分数。 "Developer" 将比 "PHP" 更常见,因此 "PHP" 将是必须的,但 "Developer" 将是可选的但评级更高。请注意,"PHP" 可能仍然很常见,因此您确实需要 微调 正确的频率!
您可以为该字段使用自定义分析器,使该字段的标记始终保持一致。在这种情况下,您可以在停用词列表中使用类型为 "stop" 的标记过滤器(停用词过滤器)和 "Developer"(以及任何其他应有效忽略的内容)。这将在索引时应用于查询和数据,因此如果索引中有 "PHP Developer",查询中有 "PHP",它们都将变成 [=34= 的标记] 所以它们将是完全匹配的。
为了使它对不同的输入方式更稳健 "Developer",您可能还想使用 "lowercase" 标记过滤器,因此停用词将改为 "developer"。
您应该注意,这将需要重新索引数据。
设置文件最终会变成这样:
{
"analysis": {
"filter": {
"job_stopwords": {
"type": "stop",
"stopwords": [
"developer", "dev"
]
}
},
"analyzer": {
"job_analyzer": {
"type": "custom",
"filter": [
"lowercase", "job_stopwords"
]
}
}
}
然后您需要将 job_analyzer 分析器应用到文档映射中的作业字段。
要 "Developer" 增加匹配分数,您可以在该字段的映射上添加一个子字段,它使用默认分析器。然后,您可以 "must" job_analyzer 和 "should" 默认分析版本。
您的映射看起来像这样:
{
"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" 将获得最高分。
假设我们在 Available Job positions Index:
上执行如下两个查询- PHP 开发者
- Ruby 开发者
当执行简单的布尔值 AND 查询位置时,如 PHP Programmer 将被排除,因为缺少 开发者。当对包含 Ruby developer[=39= 的 PHP Developer 文档执行 OR 布尔查询时] 也将包含在结果中。
检测PHP Developer 短语中的最佳方法是什么,PHP 更比 Developer?
重要因此,在针对 PHP 开发人员 执行搜索时,PHP 术语 必须 出现在结果中,但 Developer 部分只会增加分数。
我认为没有简单的答案。根据开发人员等术语的数量,您可以执行类似 Boosting 查询的操作。您必须过滤搜索查询中的字词并创建提升查询。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html
更好的方法可能是使用常用术语查询。在这里你可以给出很多文档中的术语,"high frequency" 个术语,不太重要。将 low_freq_operator 与 AND 一起使用可以帮助您完成您想要完成的任务。
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-common-terms-query.html
您可以使用常规 "match" 查询并添加 "cutoff_frequency" 参数。喜欢:
{
"query": {
"match": {
"<field_name>": {
"query": "PHP Developer",
"operator": "AND",
"cutoff_frequency": 0.001
}
}
}
}
这样,出现在不到 0.1% 的文档中的每个术语都将被视为 "important",并且将是 "must",而其他术语不会是 "must" 但只是增加分数。 "Developer" 将比 "PHP" 更常见,因此 "PHP" 将是必须的,但 "Developer" 将是可选的但评级更高。请注意,"PHP" 可能仍然很常见,因此您确实需要 微调 正确的频率!
您可以为该字段使用自定义分析器,使该字段的标记始终保持一致。在这种情况下,您可以在停用词列表中使用类型为 "stop" 的标记过滤器(停用词过滤器)和 "Developer"(以及任何其他应有效忽略的内容)。这将在索引时应用于查询和数据,因此如果索引中有 "PHP Developer",查询中有 "PHP",它们都将变成 [=34= 的标记] 所以它们将是完全匹配的。
为了使它对不同的输入方式更稳健 "Developer",您可能还想使用 "lowercase" 标记过滤器,因此停用词将改为 "developer"。
您应该注意,这将需要重新索引数据。
设置文件最终会变成这样:
{
"analysis": {
"filter": {
"job_stopwords": {
"type": "stop",
"stopwords": [
"developer", "dev"
]
}
},
"analyzer": {
"job_analyzer": {
"type": "custom",
"filter": [
"lowercase", "job_stopwords"
]
}
}
}
然后您需要将 job_analyzer 分析器应用到文档映射中的作业字段。
要 "Developer" 增加匹配分数,您可以在该字段的映射上添加一个子字段,它使用默认分析器。然后,您可以 "must" job_analyzer 和 "should" 默认分析版本。
您的映射看起来像这样:
{
"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" 将获得最高分。