elasticSearch+ik_smart 支持 符號檢索


首先 來展示下效果

 

 1% 在一起 是因為我在自定義詞庫里面定義了,如果不修改ik_smart源碼 是連百分號 都看不到的,對了 我使用的是 elasticsearch-analysis-ik-7.3.2

第一步 下載elasticsearch-analysis-ik-7.3.2源碼 找到 CharacterUtil.java這個類

將  identifyCharType 方法從這樣

static int identifyCharType(char input){
        if(input >= '0' && input <= '9'){
            return CHAR_ARABIC;
            
        }else if((input >= 'a' && input <= 'z')
                || (input >= 'A' && input <= 'Z')){
            return CHAR_ENGLISH;
            
        }else {
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(input);
            
            if(ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS  
                    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS  
                    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A){
                //目前已知的中文字符UTF-8集合
                return CHAR_CHINESE;
                
            }else if(ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS //全角數字字符和日韓字符
                    //韓文字符集
                    || ub == Character.UnicodeBlock.HANGUL_SYLLABLES 
                    || ub == Character.UnicodeBlock.HANGUL_JAMO
                    || ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO
                    //日文字符集
                    || ub == Character.UnicodeBlock.HIRAGANA //平假名
                    || ub == Character.UnicodeBlock.KATAKANA //片假名
                    || ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS){
                return CHAR_OTHER_CJK;
                
            }
        }
        //其他的不做處理的字符
        return CHAR_USELESS;
    }

修改為 這樣 對 就是多加個 else if語句塊

static int identifyCharType(char input){
        if(input >= '0' && input <= '9'){
            return CHAR_ARABIC;
            
        }else if((input >= 'a' && input <= 'z')
                || (input >= 'A' && input <= 'Z')){
            return CHAR_ENGLISH;
            
        }else {
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(input);
            
            if(ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS  
                    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS  
                    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A){
                //目前已知的中文字符UTF-8集合
                return CHAR_CHINESE;
                
            }else if(ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS //全角數字字符和日韓字符
                    //韓文字符集
                    || ub == Character.UnicodeBlock.HANGUL_SYLLABLES
                    || ub == Character.UnicodeBlock.HANGUL_JAMO
                    || ub == Character.UnicodeBlock.HANGUL_COMPATIBILITY_JAMO
                    //日文字符集
                    || ub == Character.UnicodeBlock.HIRAGANA //平假名
                    || ub == Character.UnicodeBlock.KATAKANA //片假名
                    || ub == Character.UnicodeBlock.KATAKANA_PHONETIC_EXTENSIONS){
                return CHAR_OTHER_CJK;
                
            } else if (ub == Character.UnicodeBlock.GREEK // 希臘符號
                    // 希臘擴展符號
                    || ub == Character.UnicodeBlock.GREEK_EXTENDED
                    // 拉丁字符
                    || ub == Character.UnicodeBlock.BASIC_LATIN
                    // 拉丁補充字符
                    || ub == Character.UnicodeBlock.LATIN_1_SUPPLEMENT
                    // 拉丁擴展A字符
                    || ub == Character.UnicodeBlock.LATIN_EXTENDED_A
                    // 拉丁擴展B字符
                    || ub == Character.UnicodeBlock.LATIN_EXTENDED_B) {
                return CHAR_CHINESE;
            }
        }
        //其他的不做處理的字符
        return CHAR_USELESS;
    }

然后 高能預警

使用javac 將我們修改后的 CharacterUtil 類編譯成.class文件

然后直接替換進本來的之前使用的jar包(可能沒描述清楚,截個圖)

 

 然后

 

 然后 重啟elasticSearch 搞定 (其實我也只是抱着試一試的心態 沒想到真的可以)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM