2010-12-13 8 views
2

Android 애플리케이션과 함께 sqlite FTS3 데이터베이스를 사용하고 있습니다. 내가 쿼리를하고 '집'을 검색하면Android에서 sqlite (FTS 사용)

public Cursor getWordMatches(String query, String[] columns) { 
     String selection = KEY_WORD + " MATCH ?"; 
     String[] selectionArgs = new String[] {query+"*"}; 
     return query(selection, selectionArgs, columns); 
    } 

.....

private Cursor query(String selection, String[] selectionArgs, String[] columns) { 
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
    builder.setTables(FTS_VIRTUAL_TABLE); 
    builder.setProjectionMap(mColumnMap);  

    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(), 
      columns, selection, selectionArgs, null, null, null); 

    if (cursor == null) { 
     return null; 
    } else if (!cursor.moveToFirst()) { 
     cursor.close(); 
     return null; 
    } 
    return cursor; 
} 

나는 얻을 것이다 :에 집이있다

household 
house 
apartment house 
big house 

(I는 무엇입니까 모든 것을 그것, 정규식에서 )

내 쿼리에 대해 어떻게 이런 결과를 얻을 수 있습니까?

household 
house 

내가 문 LIKE (dB 200000 개 행이 어쩌면 때문에)를 사용하는 경우

내 안드로이드 응용 프로그램 강제 종료 (그래서 난 단지 정규식 집 *에, 집으로 시작 결과를 원하는). 그래서 어떻게 든 MATCH와 LIKE 문을 결합해야합니까? 안드로이드에서이 작업을 수행 할 수 있습니까? 어쩌면 내가이 쿼리에서 얻은 후에 커서에서 일부 정규식을 실행하려고 시도해야합니까?

+0

강제 종료 스택 트레이스를 게시하십시오. –

+0

내가 LIKE를 사용할 때 : 문자열 선택 = KEY_WORD + "좋아요"; String [] selectionArgs = new String [] { " '"+ 쿼리 + "%" "}; 12-13 21 : 11 : 50.756 : ERROR/AndroidRuntime (267) : android.database.sqlite.SQLiteException : near "오류가 발생했습니다 (스택 트레이스를 알고 싶으면 다른 곳으로 옮겨야합니다) ": 구문 오류 : 컴파일 중 : SELECT rowid AS _id, suggest_text_1, suggest_text_2 FRTS FTSdictionary WHERE (suggest_text_1 LIKE) – stratocaster

답변

0

전체 텍스트 검색 테이블은 항상 LIKE가 아닌 MATCH를 사용해야합니다. LIKE 쿼리는 처음부터 FTS 테이블을 만드는 목적을 상회하는 테이블의 전체 검사를 수행하기 때문입니다.

은 FTS 테이블을 만들 때 기본 이외의 토크 나이를 사용하여 노력하고, 문제를 해결하려면 기본적으로

-- Create a table using the simple tokenizer. 
CREATE VIRTUAL TABLE simple USING fts3(tokenize=porter); 

은, SQLite는 당신이 원하지 않는 일치를 생성 할 수있는 간단한 토크 나이저를 사용합니다. 포터 토크 나이저로 전환하고 무슨 일이 일어나는 지보십시오. 최악의 경우, 사용자 정의 토크 나이저를 구현할 수 있습니다. 자세한 내용은 SQLite documentation을 참조하십시오.

+2

기본 토크 나이저가 '단순'하다고 생각했습니다. –

+0

@Ted 고마워, 나는 거꾸로했다. –

+0

예 Ted 기본 토크 나이저는 간단합니다. –