Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于mvel正则表达式的elastica评分_Php_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Mvel_Elastica - Fatal编程技术网 elasticsearch,mvel,elastica,Php,elasticsearch,Mvel,Elastica" /> elasticsearch,mvel,elastica,Php,elasticsearch,Mvel,Elastica" />

Php 基于mvel正则表达式的elastica评分

Php 基于mvel正则表达式的elastica评分,php,elasticsearch,mvel,elastica,Php,elasticsearch,Mvel,Elastica,我是弹性搜索的新手,下面是我试图解决的问题。 我有一个支持自动提示逻辑的搜索输入框。 结果来自使用ngram过滤器的弹性索引。 我想改进的是引入评分功能,以便将结果从最重要的排序到不太重要的排序(取决于分数)。 分数必须基于以下情况: 如果存在以给定字符串开头的匹配,则将分数设置为100 如果有一个匹配项包含给定的字符串,但不以该字符串开头,请将score设置为10 为此,使用mvel语句实现了elastica脚本,以支持正则表达式匹配。换句话说,它会检查左侧的值是否与右侧的正则表达式匹配(

我是弹性搜索的新手,下面是我试图解决的问题。 我有一个支持自动提示逻辑的搜索输入框。 结果来自使用ngram过滤器的弹性索引。 我想改进的是引入评分功能,以便将结果从最重要的排序到不太重要的排序(取决于分数)。 分数必须基于以下情况:

  • 如果存在以给定字符串开头的匹配,则将分数设置为100
  • 如果有一个匹配项包含给定的字符串,但不以该字符串开头,请将score设置为10
为此,使用mvel语句实现了elastica脚本,以支持正则表达式匹配。换句话说,它会检查左侧的值是否与右侧的正则表达式匹配(只有这样,变量才会相应递增)。但不幸的是,当搜索字符串是特定于语言的时,尽管左边的值也是指定语言的值,但它会出错。另一个需要处理的问题是我上面提到的第二个案例(无法实现)

当一个值('one example'(属于name字段))以给定单词('one')开头时,脚本工作正常

$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"
      }
    }
  }
}

发布你的脚本,当你尝试它时会发生什么,以及你期望会发生什么。你好,基尔尼,我发布了它。