Php 基于mvel正则表达式的elastica评分
我是弹性搜索的新手,下面是我试图解决的问题。 我有一个支持自动提示逻辑的搜索输入框。 结果来自使用ngram过滤器的弹性索引。 我想改进的是引入评分功能,以便将结果从最重要的排序到不太重要的排序(取决于分数)。 分数必须基于以下情况:Php 基于mvel正则表达式的elastica评分,php,
elasticsearch,mvel,elastica,Php,
elasticsearch,Mvel,Elastica,我是弹性搜索的新手,下面是我试图解决的问题。 我有一个支持自动提示逻辑的搜索输入框。 结果来自使用ngram过滤器的弹性索引。 我想改进的是引入评分功能,以便将结果从最重要的排序到不太重要的排序(取决于分数)。 分数必须基于以下情况: 如果存在以给定字符串开头的匹配,则将分数设置为100 如果有一个匹配项包含给定的字符串,但不以该字符串开头,请将score设置为10 为此,使用mvel语句实现了elastica脚本,以支持正则表达式匹配。换句话说,它会检查左侧的值是否与右侧的正则表达式匹配(
- 如果存在以给定字符串开头的匹配,则将分数设置为100
- 如果有一个匹配项包含给定的字符串,但不以该字符串开头,请将score设置为10
$testParam = mb_strtolower('one', 'utf-8');
$regexStart = '^' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 100; } return total; ");
当值('one example'(属于name字段))包含给定单词('example')时,脚本不起作用,因此总分保持为1,不会按应有的方式增加到11
$testParam = mb_strtolower('example', 'utf-8');
$regexStart = '^.*' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 10; } return total; ");
最后,使用相同的逻辑,当我尝试将一个希腊单词与name字段的值(包含希腊字母)匹配时,总分数的增量也被忽略
所有的工作都是使用elastica完成的,更不用说php了。
你能帮我解决问题吗?
如果有其他方法/解决方案,请随时与我分享
提前感谢您
doc['name']。value
加载该字段的分析版本。除非将字段设置为“未分析”,否则这可能与字段的原始内容非常不同,并且对于进行正则表达式匹配没有用处。上的Elasticsearch文档表示,这仅适用于未分析或单术语字段。例如,如果您的内容索引为ngrams,则此值将由ngrams组成
您可以使用\u source.field\u name
访问字段的原始文本,然后根据该文本计算您的分数。您仍然可以像往常一样对ngrams进行搜索,并使用\u源代码进行评分
下面是一个示例函数\u score
查询,该查询将分数默认为\u score
,如果名称字段以1开头,则添加100,如果名称字段在其他任何地方包含1,则添加10。它使用\u source.name
访问name字段的内容,因此它根据name字段的原始文本执行正则表达式,而不是根据name字段计算的ngram
{
"query": {
"function_score": {
"boost_mode": "replace",
"script_score": {
"script": "total = _score; if (_source.name ~= '^one.*') { total += 100 } else if (_source.name ~= '.*?one.*?') { total += 10 } return total"
}
}
}
}
发布你的脚本,当你尝试它时会发生什么,以及你期望会发生什么。你好,基尔尼,我发布了它。