Javaの先生はかつてBaiduに関するインタビューの質問を言っていたことを覚えています。これは、「10,000の乱れた記録があり、彼らから望む記録をすばやく見つける方法」を意味します。これは、単純な検索エンジンに相当します。最近、私はこれを今年整理した仕事ですでにこれを実現しています。今日はさらに抽象化します。
最初に特定の実装コードを記述し、コードの後に特定の実装のアイデアとロジックを記述します。
検索中にソートに使用される豆
/ ** *@説明: */パッケージcn.lulei.search.engine.model;パブリッククラスSORTBEAN {private String id;プライベートインクタイム; public string getId(){return id; } public void setid(string id){this.id = id; } public int getTimes(){return times; } public void tuttimes(int times){this.times = times; }}構築された検索データ構造と簡単な検索アルゴリズム
/ ** *@説明: */パッケージcn.lulei.search.engine; java.util.arraylistをインポートします。 java.util.collectionsをインポートします。 java.util.comparatorをインポートします。 java.util.hashmapをインポートします。 java.util.hashsetをインポートします。 java.util.listをインポートします。 cn.lulei.search.engine.model.sortbeanをインポートします。 public class serachbase {//詳細検索オブジェクトの詳細情報を保存します。キーはオブジェクトを区別するための一意の識別子です<string、object> details = new hashmap <string、object>(); //検索に参加するキーワードの場合、ここで使用されるスパースアレイストレージもHashMapを使用して保存することもできます。定義形式は次のとおりです。//private static hashmap <integer、hashset <string >> keysearch = new hashmap <integer、hashset <string >>(); //ハッシュマップ媒体のキー値は、スパースアレイの添え字に相当し、値はこの位置でのスパースアレイの値と同等です。 @suppresswarnings( "unchecked")private hashset <string> [] keysearch = new Hashset [maxlength]; / ***@説明:Singletonモードを実装し、初期化オンデマンドホルダーを使用してLOAD*@バージョン:1.1.0*/ private static class lazyloadserachbase {private static final serachbase serachbase = new serachbase(); } / ***シングルトンモードはここでプライベート機能に設定されています* / private serachbase(){} / *** @return* @description:get singleton* / public static serachbase getserachbase(){return lazyloadserachbase.serachbase; } / ** * @param id * @return * @description:IDに基づいて詳細を取得 * / public Object getObject(string id){return details.get(id); } / ** * @param ids * @return * @description:idsに基づいて詳細を取得する、 "、" * / public list <object> getobjects(string ids){if(ids == null || "" .equals(ids)){return null; } list <Object> objs = new ArrayList <Object>(); string [] idarray = ids.split( "、"); for(string id:idarray){objs.add(getobject(id)); } objsを返します。 } / ** * @param key * @return * @description:検索用語に従って対応するIDを見つけ、使用する "、"を使用してids * / public string getIds(string key){if(key == null || "" .equals(key)){return null; } // // idtimesを見つけて、検索用語の各文字がIDのIDに表示されるかどうかを保存します。 idtimes = new hashmap <string、integer> idtimes = new hashmap <string、integer>(); // IDSは、検索用語で文字のIDを保存します。 Hashset <string> ids = new Hashset <String>(); //(int i = 0; i <key.length(); i ++){int at = key.charat(i); //検索用語に対応する文字はありません。次に、次のキャラクターを一致させます(keysearch [at] == null){継続; } for(object obj:keysearch [at] .toarray()){string id =(string)obj; int times = 1; if(ids.contains(id)){times += idtimes.get(id); idtimes.put(id、times); } else {ids.add(id); idtimes.put(id、times); }}} // array list <sortbean> sortbeans = new ArrayList <Sortbean>(); for(string id:ids){sortbean sortbean = new sortbean(); sortbeans.add(sortbean); SORTBEAN.SETID(ID); sortbean.settimes(idtimes.get(id)); } collections.sort(sortbeans、new Comparator <Sortbean>(){public int compare(SORTBEAN O1、SORTBEAN O2){return o2.getTimes() - o1.getTimes();}}); // return string stringbuffer sb = new StringBuffer(); for(SORTBEAN SORTBEAN:SORTBEANS){sb.Append(SORTBEAN.GETID()); sb.append( "、"); } //リソースをリリースidtimes.clear(); idtimes = null; ids.clear(); ids = null; sortbeans.clear(); sortbeans = null; // return return sb.toString(); } /** * @param id * @param searchkey * @param obj * @description:検索履歴を追加 * /public void add(string id、string searchkey、object obj){//パラメーターは部分的に空で、id == null || searchkey == null || obj = null){return; } //オブジェクトの詳細を保存します。put(id、obj); //検索用語AddSearchKey(ID、SearchKey)を保存します。 }/** * @param id * @param searchkey * @description:検索用語を検索ドメインに追加 */private void addsearchKey(String ID、String SearchKey){//個別のパラメーターは空であり、ロードされていません//これはプライベートメソッドです。 } //次のものは文字分詞です。ここでは、(int i = 0; i <searchKey.length(); i ++){// ATの値はアレイのサブスクリプトに相当し、IDで構成されるハッシュセットは配列の値に相当する(int i = 0; i <searchKey.length(); i ++)を使用することもできます。 if(keysearch [at] == null){hashset <string> value = new Hashset <String>(); keysearch [at] = value; } keysearch [at] .add(id); }}}テストケース:
/ ** *@説明: */パッケージcn.lulei.search.engine.test; java.util.listをインポートします。 cn.lulei.search.engine.serachbaseをインポートします。 public class test {public static void main(string [] args){// todo auto-fenated method stub stub serachbase serachbase = serachbase.getserachbase(); serachbase.add( "1"、 "hello!"、 "hello!"); serachbase.add( "2"、 "こんにちは!私はZhang San。"、 "Hello!I'm Zhang San。"); serachbase.add( "3"、 "今日の天気はかなり良いです。"); serachbase.add( "4"、 "you?"、 "誰ですか?"); serachbase.add( "5"、 "高度な数学の主題は難しい"、 "高い数学は本当に難しい。"); serachbase.add( "6"、 "test"、 "上記は単なるテスト"); string ids = serachbase.getids( "your high Mathematics"); System.out.println(ids); List <Object> objs = serachbase.getObjects(IDS); if(objs!= null){for(object obj:objs){system.out.println(((string))obj); }}}}テスト出力の結果は次のとおりです。
5、3、2、1、4、より高い数値は実際に困難です。今日の天気はかなり良いです。こんにちは!私はチャン・サンです。こんにちは!あなたは誰ですか?
このような単純な検索エンジンは完成していると見なされます。
質問1:ここで分詞という言葉は文字分詞を使用しています。これは中国語の扱いに非常に優れていますが、英語の取り扱いは非常に弱いです。
改善方法:Ikanalyzer、StandardAnalyzerなどの現在の成熟した単語セグメンテーション法を使用します。このようにして、キーセアチャのデータ構造を修正する必要があります。これは、private hashmap <string、string> [] keysearch = new hashmap [maxlength];キーがパーツの単語要素を保存する場合、値は一意の識別子IDを保存します。
質問2:この記事で実装されている検索エンジンは、ルーセンのような単語要素の重みを設定するのではなく、単語要素がオブジェクトに表示されるかどうかを決定するだけです。
改善方法:まだありません。重量処理を追加すると、データ構造がより複雑になるため、当面は処理されておらず、将来の記事に体重処理が実装されます。
検索エンジンの実装アイデアを簡単に紹介しましょう。
Serachbaseクラスで詳細とKeysearchの2つのプロパティを設定します。詳細は、オブジェクトの詳細情報を保存するために使用され、KeySearchは検索ドメインのインデックスを作成するために使用されます。詳細データ形式はHashMapであり、Keysearchのデータ形式はスパースアレイです(Hashmapでもあり、Hashmap Mediumキー値はスパースアレイのサブスクリプトと同等であり、値はこの位置でのスパース配列の値と同等です)。
詳細はあまり紹介しません。
Keysearchの配列添え付けの計算方法(Hashmapが重要です)は、単語要素の最初の文字int値を取得することです(この記事の単語分詞が文字分詞を使用しているため、文字は単語要素です)。 int値は配列の添え字であり、対応する配列値はオブジェクトの一意の識別子です。このように、keysearchのデータ構造は次のとおりです
したがって、新しいレコードを追加する場合は、ADDメソッドを呼び出すだけです。
検索の実装ロジックは、上記のKeysearchに似ています。 ID検索には、HashMapのGETメソッドを使用してください。検索用語を検索するために、全体のプロセスでは、最初に単語セグメンテーション、2番目にクエリ、最後にソートされます。もちろん、ここの単語分詞は、作成に使用される単語分詞と一致する必要があります(つまり、作成時に文字分詞が使用され、検索時に文字分詞も使用されます)。
getIDSメソッドでは、Hashmap <String、Integer> idtimes = new Hashmap <String、integer>(); idtimes変数は、keysearchに表示される検索用語の単語要素の数を保存するために使用されます。キー値は一意の識別子IDであり、値は表示される単語要素の数です。 Hashset <string> ids = new Hashset <String>(); IDS変数は、単語の発生のIDを保存するために使用されます。この方法での検索の複雑さは、検索用語の単語要素nの数です。単語要素を含むIDを取得し、ソートビーンアレイを構築し、並べ替えます。ソートルールは、単語要素の数を降ろすことです。最後に、IDS文字列が返され、各IDは「、」によって分割されます。詳細情報を取得する場合は、GetObjectsメソッドを使用してください。
上記は単純な検索エンジンであり、あまり多くの計算方法を設計していません。私はそれが皆の学習を刺激することを願っています。