2010-12-23 3 views
1

문자열 형식으로 쿼리 문을 사용할 수있는 검색 엔진을 만들려고한다고 가정 해보십시오. 이 명령문은 주어진 특성 집합과 가능한 다른 개체에 링크 된 여러 유형의 개체를 검색하는 데 사용할 수 있습니다. OOP 접근 방식을 사용하는 일반 영어 또는 의사 코드에서 일련의 원하는 객체를 얻으려면 다음과 같이 문을 파싱하고 처리하는 방법은 무엇입니까?알고리즘 검색 : 요청 OOP 스타일 구문 분석 및 처리

  • 는 앤디의 배는
  • 는 "딥 레드"색상 딸기를 얻고 기원하지 스페인
  • 은 2010-10 사이에 멜론의 판매의 총을 얻을 녹색 사과
  • 가져 오기 다양한 과일을 얻을 -10
  • 2010-12-30 마지막 "피트"에서 바나나의 deliverydate 및 상태

이 문제는 분명 희망은 판매하지를 얻을. 그렇지 않으면 나는 재 형식화하는 것보다 더 행복 할 것이다.

P.S :이 숙제를하지 않습니다)

답변

4

문제는 Lucene과 같은 문서 지향 저장소에 적합합니다. 예를 들어, 당신은 스키마를 설계 할 수와 같은 유형
다양한
컬러
원산지 DateSold 등

등 :

그런 다음 당신이 그런 유형으로 루씬 쿼리를 작성할 수 있습니다 : 과일 및 색상 : 녹색. 또한 (Fruit : Straberry AND Color : Deep Red) AND NOT Origin : Spain과 같은 중첩 쿼리를 작성할 수 있습니다.

Apache Lucene은 대부분의 주요 언어에서 사용할 수있는 포트가있는 Java 라이브러리입니다. Apache Solr은 Lucene lib를 사용하여 빌드 된 본격적인 검색 서버이며 RESTful API가 있으므로 선택 플랫폼에 쉽게 통합 할 수 있습니다.

BTW Solr에는 사용자가 위의 각 기준을 사용하여 결과를 필터링 할 수있는 faceting이라는 것이 있습니다. 따라서 사용자는 과일을 검색 창에 입력 한 다음 검색 결과를 다시 얻습니다.


유형 : - 과일 (109) - 너트 (99)

원산지 : - 스페인 (32) - 프랑스 (39)

색상 : - 레드 (22) - 패싯 필터의 각 딥 레드 (45)


클릭 교차로로 결과. 따라서보다 사용자 친화적 인 상호 작용 모델을 원한다면 사용자가 광범위한 Lucene 쿼리를 입력하는 것보다 패싯/필터링이 훨씬 쉽습니다.

업데이트 : 사용자가 자연어 쿼리를 입력하고 해체하도록하려는 경우에도 어휘 구문 분석을 수행해야하지만 엄청나게 어려운 문제가있는 경우 간단한 & 강력한 패싯 방식을 사용하는 것이 좋습니다. 도움이 되길 바랍니다.

1

당신이 미니 언어를 개발하고 당신처럼 문법과 구문 분석과 우려 때문에 그것은 소리. 따라서 렉서와 파서를 생성하는 데 사용되는 여러 도구를 확인하십시오. 여기에서 시작할 수 있습니다 : http://en.wikipedia.org/wiki/Lexical_analysis

+0

실제로 :). 또한 요청이 분해되면 요청을 전달하는 방법을 알고 싶어합니다. –

+0

제임스 : 그것은 당신이 질의하는 모든 것에 강하게 묶여 있습니다. –

+0

알겠습니다. 요청 문자열을 분해하고 단일 객체 유형을 처리하는 일련의 메소드로 하위 요청을 전달하는 방법을 사용하는 것이 좋은 생각인지 궁금 할 것입니다. 또는 다른 방법으로 표현하면 DAO 클래스를 만들고, 읽고, 업데이트하고, 삭제하는 메서드가 있다고 상상해보십시오. 그런 다음 속성 (날짜 범위 또는 색상) 또는 다른 클래스와의 연관성을 유지하는 기준에 따라 일련의 객체를 반환하는 추가 메서드가 필요하다고 가정합니다. –

1

나는 John에 동의합니다.

는) 검색 통계를 가지고 가능성 관련 검색

이 그냥 추측이 있지만, 전에 그것을 시도하지 결코를 분석하여 관계 찾기) 인덱스에 C를 사용할) 어휘 분석 B로 시작합니다.