2012-01-29 3 views
0

MongoDB에서 위치 반전 된 인덱스를 구현하는 것이 어떻게 가능할 지 궁금합니다. 다중 키 기능을 사용하면 역 색인을 만들 수 있지만 효과적인 위치에서 발생 위치를 저장할 수있는 방법은 무엇입니까?MongoDB에서의 위치 반전 된 인덱스

의 우리가이 객체가 있다고 가정 해 봅시다

obj = { 
    name: "Apollo", 
    text: "Some text about Apollo moon landings", 
    keywords: [ "some", "text", "about", "apollo", "moon", "landings" ] 
} 
나는 "아폴로"와 "착륙"연결해야하고, 단지 "교차로"를하지 것이다 쿼리를 만들 수 있기를 알 것

질문.

답변

1

무엇에 대한 객체와 같은 : 두 키워드가 다음 상대 위치를 확인하기 위해 "여기서"필터에서 자바 스크립트를 사용하여 존재하는 쿼리를 수행하는 "keywords.text"상의 ensureIndex을 할 수

obj = { 
    name: "Apollo", 
    text: "Some text about Apollo moon landings", 
    keywords: [ 
    {idx:0, text: "some"}, 
    {idx:1, text: "text"}, 
    {idx:2, text: "about"}, 
    {idx:3, text: "apollo"}, 
    {idx:4, text: "moon"}, 
    {idx:5, text: "landings"} 
    ] 
} 

입력 키워드의

1

$ 및/또는 $ all 연산자를 사용하여 수행하려는 것으로 생각하는 것을 수행 할 수 있습니다.

귀하의 예를 감안할 때 문서 :

> db.test.find().pretty() 
{ 
    "_id" : ObjectId("4f26b716c27b085280a45a29"), 
    "name" : "Apollo", 
    "text" : "Some text about Apollo moon landings", 
    "keywords" : [ 
     "some", 
     "text", 
     "about", 
     "apollo", 
     "moon", 
     "landings" 
    ] 
} 

당신은 누구의 "키워드"배열이 두 단어가 포함 된 문서를 검색하기 위해 $ 및 연산자를 사용할 수 있습니다.

> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]}) 
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] } 
> 

모든 작업자가 동일한 결과를 반환 할 것입니다 $, 쿼리

좀 더 능률적이다 :

> db.test.find({keywords:{$all:["apollo", "landings"]}}) 
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] } 

우리가 키워드 배열에 인덱스를 넣어 경우, 두 쿼리가 사용합니다.

> db.test.ensureIndex({keywords:1}) 
> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]}).explain() 
{ 
    "cursor" : "BtreeCursor keywords_1", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "keywords" : [ 
      [ 
       "apollo", 
       "apollo" 
      ] 
     ] 
    } 
} 
> db.test.find({keywords:{$all:["apollo", "landings"]}}).explain() 
{ 
    "cursor" : "BtreeCursor keywords_1", 
    "nscanned" : 1, 
    "nscannedObjects" : 1, 
    "n" : 1, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "keywords" : [ 
      [ 
       "apollo", 
       "apollo" 
      ] 
     ] 
    } 
} 
> 

두 쿼리 모두 키워드 색인을 사용합니다.

다른 유형의 쿼리에 대한 자세한 내용은 "고급 쿼리"문서를 참조하십시오.
http://www.mongodb.org/display/DOCS/Advanced+Queries

Mongo에서 색인 생성이 작동하는 방법에 대한 자세한 내용은 "색인 생성"문서를 참조하십시오.
http://www.mongodb.org/display/DOCS/Indexes#Indexes-IndexingArrayElements

"인덱싱 배열 요소"섹션은 MultiKeys의 설명서로 연결됩니다. 당신이 MongoDB를의 .explain 기능에 익숙하지 않은 경우 http://www.mongodb.org/display/DOCS/Multikeys

, 여기 설명 : 간단히 말해서 http://www.mongodb.org/display/DOCS/Explain , 그것은 순서로 액세스 할 수있는 쿼리가 사용하는 인덱스, 얼마나 많은 필요한 문서를 표시 관련된 것들을 반환합니다.

마지막으로 질문은 오늘 아침 배열에서 값을 검색하는 다른 사용자의 질문과 비슷합니다. 아마도 이것은 당신과 관련이있을 것입니다.
http://groups.google.com/group/mongodb-user/browse_thread/thread/38f30a56094d9e3e

바라 건데, 이것은 당신이 당신이 찾고있는 쿼리를 작성하는 데 도움이 될 것입니다. 후속 질문이 있으면 알려주십시오.

+0

내 질문이 잘못 작성되었을 수 있습니다. 그러나 해결하고 싶은 문제는 "apollo"와 "landings"가 어구 쿼리 "apollo landings"와 같이 서로 옆에 서있는 경우에만 결과를 반환해야한다는 것입니다. . "apollo xxxx landings"이라는 텍스트가있는 경우 문구가 아니기 때문에 결과로 결과를 반환하지 않아야합니다. 그러한 질의를 할 수 있습니까? – freakshow