2017-02-15 3 views
-1

私は入力として受け取ったテキストに300万個の文字列が含まれているかどうかをチェックする必要があります。多数の文字列が一致するテキストを検索する

は私が一致する正規表現を試みたが、文字列のリストが50Kを越えた後のパフォーマンスは、私が

inText = java.util.regex.Pattern.compile("\\b" + findStr + "\\b", 
     java.util.regex.Pattern.CASE_INSENSITIVE).matcher(intext).replaceAll(repl); 

は、私たちは検索インデックスを使用することができます理解して検索リスト内の各単語のためにこれをやっている

非常に悪いですluceneのように、私はそれらが主に事前定義されたテキストから特定のテキストを検索すると思うが、私のユースケースは反対です、私は大きなテキストを送信し、テキスト内にある定義された文字列があるかどうかを確認する必要があります

答えて

1

私は、あなたが取ることができると思うそれ以外の方法でそれをします。定義済みの文字列は逆インデックスに格納されたドキュメントであり、入力テキストはクエリであり、ドキュメントに対してテストします。あらかじめ定義された文字列はあまり変更されないため、非常に効果的です。

私はいくつかのElasticsearchコードを準備しました。それはそのトリックを行います。

public void add(String string, String id) { 
     IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, id); 
     indexRequest.source(string); 
     index(INDEX, TYPE, id, string); 
    } 

    @Test 
    public void scoring() throws Exception { 
     // adding your predefined strings 
     add("{\"str\":\"string1\"}", "1"); 
     add("{\"str\":\"alice\"}", "2"); 
     add("{\"str\":\"bob\"}", "3"); 
     add("{\"str\":\"string2\"}", "4"); 
     add("{\"str\":\"melanie\"}", "5"); 
     add("{\"str\":\"moana\"}", "6"); 

     refresh(); // otherwise we would not anything 

     indexExists(INDEX); // verifies that index exists 
     ensureGreen(INDEX); // ensures cluster status is green 


     // querying your text separated by space, if the hits length is bigger than 0, you're good 
     SearchResponse searchResponse = client().prepareSearch(INDEX).setQuery(QueryBuilders.termsQuery("str", "string1", "string3", "melani")).execute().actionGet(); 
     SearchHit[] hits = searchResponse.getHits().getHits(); 

     assertThat(hits.length, equalTo(1)); 

     for (SearchHit hit: hits) { 
      System.out.println(hit.getSource()); 
     } 

    } 
関連する問題