2013-06-03 4 views
31

내 응용 프로그램에 전체 텍스트 기능을 제공하기 위해 사용하는 배열 "키"에 색인이 있습니다.MongoDB 텍스트 검색 및 복수 검색 단어

2.4.3 릴리스에서 "텍스트"색인 유형을 사용하고 싶습니다. 내 배열 "키"에 "텍스트"인덱스 유형을 보증하고 그것은 슈퍼 빠른 (내 옛 키워드 전체 텍스트 방법보다 빠릅니다) 작동하는 것 같습니다.

문제는 내 앱이 필드가 포괄적이라고 가정합니다. 기본적으로 텍스트 검색은 내 매개 변수와의 OR 연산자입니다.

누구나 텍스트 검색을 포괄적으로 실행하는 방법을 알고 있습니까? 예를 들어

:

db.supplies.runCommand("text", {search:"printer ink"}) 

대신 프린터 또는 잉크 중 모든 결과를 프린터의 잉크 모두 결과를 반환한다.

+5

나는 단어 줄기를 죽이지 않는 해결책을 정말 고맙게 생각할 것입니다. – Mitja

+2

단어 형태소 분석으로 해결책을 찾을 수 있습니까? – Zhomart

답변

49

을 시도 보내기 또한

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

가 여기 docs에서 인용입니다 :

검색 문자열이 문구가 포함 된 경우, 검색은 검색에 AND 와 다른 용어를 수행 끈; 예 : "\"반짝임 검색 반짝임 \ "작은 별"은 "반짝 반짝 반짝임"과 ("작은"또는 "별")을 검색합니다.

희망이 있습니다.

+2

당신. 록. 경. 고맙습니다. – kmehta

+8

이것은 휴지통에있는 단어와 같은 텍스트 색인의 멋진 기능을 던집니다. 내 텍스트가 인데'이것들은 멋진 테스트 항목입니다 ' , 나는'{$ search : "entry"} "로 찾겠지만'{$ search :"\ "entry \" "}는 찾지 않을 것입니다. – Mitja

+0

@Mitja 어쨌든 단어 형태를 잃지 않고이 작업을 수행 할 수 있습니까? – Rohmer

2

당신은 큰 따옴표로 각 단어를 포장 할 수 있습니다 : 사용자가이 작동하지 않습니다 인용 된 문자열을 입력하면 단점이 있습니다

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); 
match.$text = { $search: keywords, $caseSensitive: false }; 

. 먼저 인용 문자열을 파싱해야합니다.