LuceneFuzzyQuery原理

编程

基于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异常时你才需要适当调大这个值

以上是 LuceneFuzzyQuery原理 的全部内容, 来源链接: utcz.com/z/512820.html

回到顶部