当前位置: 首页 > 知识库问答 >
问题:

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

苗阳
2023-03-14
    null

为此,使用mvel语句实现了一个elastica脚本,以支持正则表达式匹配。换句话说,它检查左边的值是否与右边的正则表达式匹配(只有这样一个变量才会相应地递增)。但不幸的是,当搜索字符串是特定于语言的时,就会出错,尽管左边的值也是指定的语言。另一个需要处理的问题是我上面提到的第二种情况(无法使其工作)。

当一个值(“一个示例”(属于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; ");

共有1个答案

沈成天
2023-03-14

doc['name'].value加载字段的分析版本。除非您的字段设置为not Analysed,否则这可能与字段的原始内容非常不同,并且对于执行regex匹配没有用处。关于脚本字段的Elasticsearch文档说,这只对非分析字段或单个术语字段有意义。例如,如果您的内容被索引为ngrams,则此值将由ngrams组成。

您可以使用_source.field_name访问该字段的原始文本,然后根据该文本计算得分。您仍然可以像往常一样根据ngrams进行搜索,并使用_source进行评分。

下面是一个示例functhtml" target="_blank">ion_score查询,它将分数默认为_score,如果name字段以1开头,则添加100,如果name字段在其他地方包含1则添加10。它使用_source.name访问name字段的内容,因此它是针对name字段的原始文本而不是从name字段计算的ngrams执行regex的。

{
  "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"
      }
    }
  }
}
 类似资料:
  • Vim是一个文本编辑器,这意味着大量的Vimscript代码将专注于处理文本。 Vim对正则表达式有着强大的支持,尽管一如既往地也有着一些坑。 把下面的文本打到缓冲区中: :::text max = 10 print "Starting" for i in range(max): print "Counter:", i print "Done" 这个就是我们将用来测试Vimscri

  • 我有一个表格形式的命令输出。我正在解析结果文件的输出并将其存储在字符串中。一行中的每个元素由一个或多个空格字符分隔,因此我使用正则表达式匹配1个或多个空格并拆分它。但是,在每个元素之间插入一个空格: 还有更好的方法吗? 每次拆分后,str2都会附加到列表中。

  • 问题内容: 我将如何编写一个正则表达式来删除所有以#开头并在该行结束处停止的注释-但同时要排除前两行,即 和 问题答案: 您可以通过使用解析Python代码来删除注释。以下是从docs对该示例进行的稍微修改的版本: 例如: 如果script.py包含 然后的输出是

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 正则表达式是一种可以和输入文本相匹配的表达式。.Net framework 提供了一个正则表达式引擎让这种匹配成为可能。一个表达式可以由一个或多个字符,运算符,或结构体组成。 构建正则表达式的定义 有很多种类的字符,运算符,结构体可以定义正则表达式。 转义字符 字符类 集合 分组构造 限定符 回溯引用构造 可替换结构 替换 混合结构 Regex 正则表达式类 Regex 类用于表示一个正则表达式。

  • 11.2 基础正则表达式 既然正则表达式是处理字串的一种表示方式,那么对字符排序有影响的语系数据就会对正则表达式的结果有影响! 此外,正则表达式也需要支持工具程序来辅助才行!所以,我们这里就先介绍一个最简单的字串撷取功能的工具程序,那就是 grep 啰! 前一章已经介绍过 grep 的相关选项与参数,本章着重在较进阶的 grep 选项说明啰! 介绍完 grep 的功能之后,就进入正则表达式的特殊字