php - 匹配最佳相似数组元素

标签 php regex elasticsearch similarity

我有一组关键字,在这些关键字上运行foreach循环,并将每个元素与特定搜索词匹配。例如我有像数组

Array(
   [0] => polka dresses
   [1] => polka clothes
   [2] => polka dots dress
   [3] => polka dots bottoms
)

我在数组中搜索polka这个词。使用strposstristr时,它会给出结果(也尝试过similar_text,但没有结果)。

问题

如果我搜索polka可以正常工作,但是如果不小心输入了p0lka,则不会给出任何结果。
无论如何要实现这一目标。

最佳答案

  • 如果要获得键入单词的最相似结果,则可以计算搜索到的单词和存储的单词之间的Levenshtein distance,并返回距离最小的结果。
  • 您可以为此使用PHP的levenshtein函数。

  • PHP代码段:
    <?php
    
    $data = array(
       'polka dresses',
       'polka clothes',
       'polka dots dress',
       'polka dots bottoms',
       'dummy dummy'
    );
    
    function getSimilarMatches($sentences,$search_str){
        $min_distance = -1;
        $closest_matches = [];
    
        foreach($sentences as $sentence){
            $min_levenshtein_dist = -1;
            foreach(explode(" ",$sentence) as $word){
                $levenshtein_dist = levenshtein($word,$search_str);
                if($min_levenshtein_dist == -1 ||  $min_levenshtein_dist > $levenshtein_dist){
                    $min_levenshtein_dist = $levenshtein_dist;
                }
            }
            if($min_distance == -1 || $min_distance > $min_levenshtein_dist){
                $min_distance = $min_levenshtein_dist;
                $closest_matches = [];
                $closest_matches[] = $sentence;
            }else if($min_distance === $min_levenshtein_dist){
                $closest_matches[] = $sentence;
            }
        }
    
        return $closest_matches;
    }
    
    
    print_r(getSimilarMatches($data,'polka'));
    print_r(getSimilarMatches($data,'p0lka'));
    

    演示: https://3v4l.org/E9gea

    关于php - 匹配最佳相似数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59540896/

    相关文章:

    php - 使用PHP的“注意: undefined variable ”,“注意: undefined index ”和“注意: undefined offset ”

    mysql - 如果变量前有连字符,则 REGEXP 不匹配

    javascript - 将日志从Javascript发送到ElasticSearch

    elasticsearch - geoip.location不适用于通过Logstash发送的已修改索引名称

    elasticsearch - 如何通过查询更新以从 elasticsearch 6.4 中的排序查询创建递增排名

    PHP XDEBUG 未启用

    php - 从单选按钮获取选定的值并将其插入到 MySQL

    php - 如何将.doc文件内容插入mysql表

    regex - 用 <pre> 标签内的方括号 (<>) 替换除 <pre> 标签内的换行符

    c++ - 正则表达式。查找所有非拉丁字符的单词