2017-02-15 3 views
-1

입력으로받은 텍스트에 3 백만 개의 문자열이 있는지 확인해야하는 유스 케이스가 있습니다.일치하는 많은 수의 문자열 검색 텍스트

나는 일치하는 정규 표현식을 시도했지만 문자열 목록이 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()); 
     } 

    } 
관련 문제