MongoDB 인덱스 의 전체 텍스트 인덱스
8939 단어 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/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
레코드를 업데이트하고 업데이트 전에 동일한 레코드를 삭제하는 방법(nest js & mongoDB)ID로 레코드를 업데이트하고 싶지만 업데이트 전에 동일한 레코드에 이전에 저장된 데이터를 삭제하고 싶습니다. 프로세스는 무엇입니까? 컨트롤러.ts 서비스.ts 나는 이것을 해결하기 위해 이런 식으로 노력하고 있습니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.