我是弹性搜索的新手,这是我要解决的方案。我有一个支持自动建议逻辑的搜索输入框。结果是从使用 ngram 过滤器的弹性索引中获取的。我要改进的是引入评分功能,以便将结果从最重要的结果排序到次要的结果(取决于分数)。分数必须基于以下情况:
- 如果存在以给定字符串开头的匹配项,则设置分数 100
- 如果有一个匹配包含给定的字符串并且不以它开头,则将 score 设置为 10
为此,使用 mvel 语句实现了一个 elastica 脚本,以支持正则表达式匹配。换句话说,它检查左边的值是否与右边的正则表达式匹配(只有这样一个变量才会相应地递增)。但不幸的是,尽管左侧的值也是指定语言的,但当搜索字符串是特定于语言的时,它会出错。另一个要处理的问题是我上面提到的第二种情况(无法使其工作)。
以给定单词 ('one') 开头的值 ('one example' (属于 name 字段)) 的脚本工作得很好。
$testParam = mb_strtolower('one', 'utf-8');
$regexStart = '^' . $testParam . '.*$';
$ElasticaScript = new Elastica_Script(" total = 1; if(doc['name'].value ~= '{$regexStart}'){ total += 100; } return total; ");
当值('一个示例'(属于名称字段))包含给定单词('示例')时的脚本不起作用,因此总分保持 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; ");
最后,使用相同的逻辑,当我尝试将希腊词与名称字段的值(包含希腊字母)进行匹配时,总分的增量也会被忽略。
所有的工作都是使用elastica完成的,更不用说php了。你能帮忙解决我的问题吗?如果有其他方法/解决方案,请随时与我分享。
先感谢您