2008-08-17 4 views
5

검색 쿼리를 구문 분석하고이를 내 DB에 대한 SQL 쿼리로 변환하는 쉬운 방법을 찾으려고했습니다.Java에서 검색 쿼리 구문 분석

내가 찾은 두 가지 솔루션 :

  1. Lucene : 강력한 자바 기반의 검색 엔진 쿼리 파서를 포함하지만, 아주 구성 할 수 없습니다 내가 쉽게 해킹 할 수있는 방법을 찾을 수/그것을 적응 SQL 쿼리를 만들 수 있습니다.
  2. ANTLR : 베테랑 텍스트 렉서 파서. 컴파일러에서부터 하늘 긁는 도구에 이르기까지 무엇이든 만드는데 사용됩니다. ...

다른 아이디어 ANTLR 매우 구성 할 수 있지만, 지금의 코드를 만지지 모두가 새로운 언어를 배워야 할 것인가?

답변

0

구문 분석 할 쿼리의 종류와 데이터베이스의 데이터 구조에 따라 다소 차이가 있습니다. 나는 대부분의 정보 검색 사람들이 당신에게 말할 것이기 때문에 당신이 DB (즉, 전체 DB를 가로 지르는 검색 엔진)에서 전체 텍스트 검색을 시도하지 않는다고 가정 할 것입니다. 그 성능은 끔찍합니다. 반전 된 인덱스가 가장 확실한 방법입니다.

실제 문제에 대해 더 자세히 알려주십시오. 사용자가 입력 할 내용, 예상되는 출력 및 데이터 모델은 무엇입니까? 이러한 정보없이 검색 솔루션을 설계하면 최적의 결과를 훨씬 벗어날 수 있습니다.

1

정확히 무엇을 염두에 두시겠습니까? 나는 Lucene을 텍스트 검색에 사용했지만 인덱스를 구축하고 대신을 검색하는 것이 탁월합니다.

최근에 나는 모든 열 (공백으로 구분)을 하나의 필드로 연결하고이를 Lucene으로 팝핑 한 다음 기본 키를 별도의 열에 추가하여 Lucene의 테이블에 색인을 생성하는 시스템을 설정했습니다. Lucene은 모든 검색을 수행하고 기본 키 목록을 반환했습니다.이 기본 키는 내가 채워진 결과 집합을 끌어와 사용자에게 표시하는 데 사용되었습니다.

검색 쿼리를 SQL 문으로 변환하면 조금 혼란 스럽습니다.

또한 여기는 a great beginning tutorial explaining the basic structure of Lucene입니다.

0

전체 텍스트 검색을 원하지 않는다고 가정하십시오.

  1. 해리 :

    검색 쿼리

    이 종류의 있습니다 ... 날짜 : 이름 : 문자열, 발행인 : 문자열, NUM_PAGES 개 INT, 게시 _ 정보는이 책의 정보에 대한 스키마과 같은 형태 포터
    는 (이름은 해리 포터 모두 가지고 whos는 어떤 책을 검색)
  2. 발행인 : 자연 * (100 개 이상의 책을 자연과 함께 시작하는 출판사에서 책) 페이지> 100
  3. ("새해"또는 크리스마스) 및 선물 (사진을 찍으세요 ...)
  4. 물리학 및 게시> 2008년 1월 1일 (새 물리학 책)
1

당신은 수동으로 문자열을 구문 분석 다른 파서를 구현하거나하는) javacc (자바 컴파일러 컴파일러 같은 것을 사용하여 시도해 볼 수도 있습니다 무차별 한 힘. 표현식을 발견 할 때마다 객체로 표현합니다. 그런 다음 표현식 트리를 where 절로 변환하면됩니다. 예를 들어

는 "해리 포터"

new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter") 

그리고이된다 "발행인 : 자연 * 페이지> 100", 그리고

new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100)) 

이된다 당신이이되면, 그들을 설정하는 매우 쉽습니다 SQL로 :

FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    sql.append(fieldName); 
    sql.append(" like "); 
    sql.append("'%?%'"); 
    args.add(value); 
} 

AndExp.toSQL(StringBuffer sql, Collection<Object> args) { 
    exp1.toSQL(sql, args); 
    sql.append(" AND "); 
    exp2.toSQL(sql, args); 
} 

나머지는 상상할 수 있습니다. And를 원하는만큼 깊게 중첩시킬 수 있습니다.

3

SQL-ORM 개체

IMHO의 그래프로 자바에서 (동적) SQL 쿼리를 구성 할 수있는 기능이 포함되어 매우 가볍고 자바 라이브러리입니다, 이것은 평소보다 동적 SQL 쿼리를 구축하기위한 훨씬 더 나은 기술이다 문자열 결합 방법.

면책 조항 :이 프로젝트에와 나침반 (OSEM을위한 프레임 워크()는 OpenJPA처럼)는 ORM 도구를 결합하는

+0

매우 흥미 롭습니다. 맵핑과 XML을 사용하지 않고 IBatis처럼 보입니다. –

0

시도를 몇 가지 매우 작은 기여를했다. ORM 도구를 통해 수행 된 업데이트를 자동으로 인덱싱하고 Lucene 검색 기능을 제공합니다. 그 후에는 물론 DB에서 객체를 가져올 수 있습니다. 모든 SQL 기반 검색 솔루션을 능가합니다.

-2

문자열 [] 배열;

int checkWord(String searchWord) 
{ 
    for(int i = 0; i < array.length; i++) 
    { 
     if(searchWord.equals(array[i])) 
      return i; 
    } 
    return 0; 

} 
+0

이것은 실제로 질문에 대답하지 않습니다. –