MongoDB 인덱스 의 전체 텍스트 인덱스

8939 단어 mongodb
mongodb full text search (fts: 전체 텍스트 검색 소) 는 버 전 2.4 에 새로 추 가 된 특성 입 니 다.이전 버 전에 서 는 정확 한 일치 와 정규 표현 식 을 통 해 조회 하 였 는데, 이 효율 은 매우 낮 았 다.전체 텍스트 색인 은 대량의 텍스트 에서 필요 한 내용 을 검색 하고 다 국적 언어 와 단어 구분 방법 을 내장 할 수 있 습 니 다.우주 제1 언어 인 중국 어 는 지원 되 지 않 습 니 다.전체 텍스트 색인 은 mongodb 의 기록 성능 을 떨 어 뜨 릴 수 있 습 니 다. 모든 문자열 을 분리 하여 다른 곳 에 저장 해 야 하기 때 문 입 니 다. 
전체 텍스트 색인 은 기술 이 며 대량으로 사용 된다.예 를 들 어 검색엔진, 사이트 내 검색 등등.자주 사용 하 는 전체 텍스트 검색: 
lucene 
sphinx 
redis-search 
riak search 
하지만 중국어 검색 은 미흡 했다. 
mongodb 는 오픈 소스 의 snowball 분사 기 를 사용 합 니 다.참조 하 다http://snowball.tartarus.org/texts/stemmersoverview.html
mongodb 전체 텍스트 인덱스 지원 언어 는 다음 과 같 습 니 다: 
danish 
dutch 
english 
finnish 
french 
german 
hungarian 
italian 
norwegian 
portuguese 
romanian 
russian 
spanish 
swedish 
turkish 
다른 언어 를 사용 하려 면 색인 을 만 들 때 사용 할 언어 를 지정 해 야 합 니 다.기본 값 은 영 어 를 지원 합 니 다. 
>db.collection.ensureIndex({content:"text"},{default_language:"spanish"}) 
전체 텍스트 인덱스 열기 
기본적으로 닫 혔 습 니 다.그렇지 않 으 면 "err" 를 잘못 알 릴 수 있 습 니 다. "text search not enabled" 
스 크 립 트 에서 설명 을 사용 할 수 있 습 니 다: 
> db.adminCommand({setParameter:1,textSearchEnabled:true}) 
{ "was" : true, "ok" : 1 } 
설정 변경 사용: mongod -- setParameter textSearch Enabled = true 
2. 테스트 데이터 삽입 
다음은 '캘 리 포 니 아 호텔' 이라는 20 세기 의 매우 유명한 대중 음악 을 삽입 한 것 이다. 
> db.ttlsa_com.insert({"song":"1. Hotel California", "lyrics": "On a dark desert highway, cool wind in my hair. Warm smell of colitas, rising up through the air."}) 
> db.ttlsa_com.insert({"song":"2. Hotel California", "lyrics": "Up ahead in the distance, I saw a shimmering light. My head grew heavy and my sight grew dim."}) 
> db.ttlsa_com.insert({"song":"3. Hotel California", "lyrics": "Such a lovely place, Such a lovely face."}) 
> db.ttlsa_com.insert({"song":"4. Hotel California", "lyrics": "Some dance to remember, some dance to forget."}) 
> db.ttlsa_com.insert({"song":"5. Hotel California", "lyrics": "Welcome to the Hotel California"}) 
> db.ttlsa_com.insert({"song":"hell world", "lyrics": "Welcome to beijing"}) 

> db.ttlsa_com. insert ({"song": "캘 리 포 니 아 호텔", "가사": "호텔 캘 리 포 니 아 에 오신 것 을 환영 합 니 다"}) 
3. 전체 텍스트 인덱스 만 들 기 
> db.ttlsa_com.ensureIndex({"song":"text", "lyrics":"text"}) 
혹은 
> db.ttlsa_com.ensureIndex({"$**": "text"}) 
$* * 는 모든 문자열 필드 에 전체 텍스트 색인 을 만 드 는 것 을 표시 합 니 다. 
가중치 도 지정 할 수 있 습 니 다. 
> db.ttlsa_com.ensureIndex({"song":"text"},{"weights":{"song": 2, "$**": 3}}) 
4. 색인 정보 보기 
>db.system.indexes.find().toArray() 
[{
"v": 1,
"key": {
"_id": 1
},
"name": "_id_",
"ns": "test.ttlsa_com"
},
{
"v": 1,
"key": {
"_fts": "text",
"_ftsx": 1
},
"name": "song__lyrics_",
"ns": "test.ttlsa_com",
"weights": {
"lyrics": 1,
"song": 1
},
"default_language": "english",
"language_override": "language",
"textIndexVersion": 2
}] 

조회 
전체 텍스트 인덱스 통과 
db.collection.runCommand( "text", { search:
filter:
project:
limit:
language: } ) 
검색 하 러 왔 습 니 다. find () 명령 을 통 해 이 루어 지지 않 았 습 니 다.db. ttlsacom.find({$text:{$search:"aa bb"}});
1. 한 단 어 를 검색 하면 텍스트 명령 은 대소 문 자 를 구분 하지 않 습 니 다. 
> db.ttlsa_com.runCommand("text",{search:"Welcome"}) 
{ 
"results" : [ 
{ 
"score" : 0.6666666666666666, 
"obj" : { 
"_id" : ObjectId("550a615dd8511e4dbcb8c77a"), 
"song" : "5. Hotel California", 
"lyrics" : "Welcome to the Hotel California" 
} 
}, 
{ 
"score" : 0.6666666666666666, 
"obj" : { 
"_id" : ObjectId("550a6163d8511e4dbcb8c77b"), 
"song" : "    ", 
"lyrics" : "Welcome to the Hotel California" 
} 
} 
], 
"stats" : { 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 2, 
"timeMicros" : 1486, 
"shards" : { 
"shard_a" : { 
"nscanned" : NumberLong(2), 
"nscannedObjects" : NumberLong(2), 
"n" : 2, 
"timeMicros" : 917 
} 
} 
}, 
"ok" : 1 
} 

2. 모호 검색 
> db.ttlsa_com.runCommand("text",{search:"Such lovely"}) 
{ 
"results" : [ 
{ 
"score" : 1.125, 
"obj" : { 
"_id" : ObjectId("550a6154d8511e4dbcb8c778"), 
"song" : "3. Hotel California", 
"lyrics" : "Such a lovely place, Such a lovely face." 
} 
} 
], 
"stats" : { 
"nscanned" : 1, 
"nscannedObjects" : 1, 
"n" : 1, 
"timeMicros" : 618, 
"shards" : { 
"shard_a" : { 
"nscanned" : NumberLong(1), 
"nscannedObjects" : NumberLong(1), 
"n" : 1, 
"timeMicros" : 272 
} 
} 
}, 
"ok" : 1 
} 

3. 단어 일치 
> db.ttlsa_com.runCommand("text",{search:"\"Some dance to remember\""}) 
{ 
"results" : [ 
{ 
"score" : 1.75, 
"obj" : { 
"_id" : ObjectId("550a6158d8511e4dbcb8c779"), 
"song" : "4. Hotel California", 
"lyrics" : "Some dance to remember, some dance to forget." 
} 
} 
], 
"stats" : { 
"nscanned" : 2, 
"nscannedObjects" : 1, 
"n" : 1, 
"timeMicros" : 743, 
"shards" : { 
"shard_a" : { 
"nscanned" : NumberLong(2), 
"nscannedObjects" : NumberLong(1), 
"n" : 1, 
"timeMicros" : 306 
} 
} 
}, 
"ok" : 1 
} 

4. 일부 단어 와 일치 하지만 지정 한 단 어 를 포함 할 수 없습니다. 
> db.ttlsa_com.runCommand("text",{search:"Welcome -California"}) 
{ 
"results" : [ 
{ 
"score" : 0.75, 
"obj" : { 
"_id" : ObjectId("550a687fd8511e4dbcb8c781"), 
"song" : "hell world", 
"lyrics" : "Welcome to beijing" 
} 
} 
], 
"stats" : { 
"nscanned" : 4, 
"nscannedObjects" : 4, 
"n" : 1, 
"timeMicros" : 743, 
"shards" : { 
"shard_a" : { 
"nscanned" : NumberLong(4), 
"nscannedObjects" : NumberLong(4), 
"n" : 1, 
"timeMicros" : 345 
} 
} 
}, 
"ok" : 1 
} 

5. 결과 집합 항목 제한 
>db.ttlsa_com.runCommand("text",{search:"Welcome",limit: 1}) 
6. 결과 에 되 돌아 오 는 필드 를 집중 적 으로 지정 합 니 다. 
>db.ttlsa_com.runCommand("text",{search:"Welcome",project:{"song":1,"_id":0}}) 
7. 추가 검색 조건 이 있 는 검색 
>db.ttlsa_com.runCommand("text",{search:"Welcome",filter: {"song":"hell world"}}) 
8. 특정 언어 로 텍스트 검색 
>db.ttlsa_com.runCommand("text",{search:"Welcome",language:"spanish"}) 
9. 분사 효과 가 좋 지 않다.... 와 같다 
>db.ttlsa_com.runCommand("text",{search:"the"}) 
{ 
"results" : [ ], 
"stats" : { 
"nscanned" : 0, 
"nscannedObjects" : 0, 
"n" : 0, 
"timeMicros" : 432, 
"shards" : { 
"shard_a" : { 
"nscanned" : NumberLong(0), 
"nscannedObjects" : NumberLong(0), 
"n" : 0, 
"timeMicros" : 151 
} 
} 
}, 
"ok" : 1 
} 

검색 이 안 돼. 
mongodb 는 중국어 검색 을 지원 하지 않 습 니 다.전체 텍스트 인덱스 는 유사 도 를 통 해 조건 과 더 일치 하 는 글 을 조회 할 수 있 습 니 다. 다음 과 같 습 니 다.
>db.
ttlsa_com.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
조회 결 과 는 싱크로 율 점 수 를 되 돌려 줍 니 다.sort 와 결합 하여 싱크로 율 정렬 을 할 수 있 습 니 다.
>db.
ttlsa_com.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}});
복잡 한 검색 기능 을 사용 하 시 겠 습 니까? 아니면 sphinx 를 사용 하 시 겠 습 니까? 
sphinx 내용 참조:http://www.ttlsa.com/?s=sphinx
자세 한 사용 참고:http://blog.csdn.net/black_ox/article/details/21547651
다음으로 이동:http://www.ttlsa.com/mongodb/mongodb-full-text-search-mongodb-ttlsa-tutorial-series/

좋은 웹페이지 즐겨찾기