Lucene FuzzyQuery 原理

孤者浪人 提交于 2020-02-28 04:21:20

基于Levenshtein Edit Distance(莱温斯坦编辑距离)基础上,对索引文档进行模糊搜索

  • Levenshtein算法是计算两个字符串之间的最小编辑距离的算法,
  • 所谓的最小编辑距离就是把字符串A通过添加删除替换字符的方式转变成B所需要的最少步骤
    • 比如:你文档里有个xiaopingguo字符,你拿“xiapngguo”去匹配,这时我们知道他们的编辑距为2,
      • 具体步骤就是ap之间插入一个字母o,pn之间插入一个字母i,所以编辑距为2,
  • 代码详见LevenshteinTest
    • /**
       * @author Jly
       * @date 2020/1/16  19:40
       */
      public class LevenshteinTest {
      
          public static int levenshtein(String str1,String str2) {
              int n = str1.length();
              int m = str2.length();
              if ( n == 0)
                  return m;
              if ( m == 0)
                  return n;
              int[][] Arr = new int[m + 1][n + 1];
              int cost = 0;
              for(int i=0;i<=n;i++)
                  Arr[0][i] = i;
              for(int j=0;j<=m;j++)
                  Arr[j][0] = j;
              for(int i=1;i<=n;i++)
                  for(int j=1;j<=m;j++)
                  {
                      if (str1.charAt(i-1) == str2.charAt(j-1))
                          cost = 0;
                      else
                          cost = 1;
                      Arr[j][i] = Arr[j-1][i]+1<Arr[j][i-1]+1?Arr[j-1][i]+1:Arr[j][i-1] +1 ;
                      Arr[j][i] = Arr[j][i]<Arr[j-1][i-1]+cost?Arr[j][i]:Arr[j-1][i-1]+cost;
                  }
              int nEdit = Arr[m][n];
              return nEdit;
          }
      
          public static void main(String[] args) {
              System.out.println(levenshtein("acdf", "abc"));
              System.out.println(111);
          }
      }
  • FuzzyQuery的最大编辑距最大为2 ,超过2的直接抛弃
    • 意思就是如果你用字母“abs”去搜索“absolutely”(两者编辑距为7)
      • 在构建FuzzyQuery实例对象的时候,如果你把maxEdits设置为2,肯定搜不出来这毫无疑问
      • 可是如果把maxEdits设置为7,FuzzyQuery对象构造都通不过,默认只支持编辑距0~2的查询
      • 特此提醒!官方提示:
        • 因为编辑距设置太大会返回很多不相关的内容,官方不推荐你这么做,
        • 如果你需要支持这种功能,官方建议你移步到spellCheck模块(拼写检查模块)
  • prefixLength 表示指定长度的前缀会被认为是100%相似
    • 默认prefixLength是等于零的
    • prefixLength长度可以加快匹配速度,因为你已经告诉了FuzzyQuery前N个字符是完全相同的,自然查询速度加快了
  • maxExpansions ​​​​​​​设置在指定编辑距之内的所有Term的最大容量是多大
    • 因为这些Term最终是要放入一个优先级队列(PriorityQueue)中的,
    • 然后通过BooleanQuery拼接成条件的,
    • 而BooleanQuery能拼接的条件个数是有限制的,所以弄个maxExpansions最大值设置,默认值是50,一般默认值就可以了,
      • 除非出现了too many boolean clause异常时你才需要适当调大这个值
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!