복붙노트

[MONGODB] MongoDB를 접두사 와일드 카드 : 전체 텍스트 검색 ($ 텍스트) 검색 문자열 부분을 찾아

MONGODB

MongoDB를 접두사 와일드 카드 : 전체 텍스트 검색 ($ 텍스트) 검색 문자열 부분을 찾아

나는이 같은 $ 텍스트 색인 및 요소와 MongoDB를이 :

{
   foo: "my super cool item"
}
{
   foo: "your not so cool item"
}

내가 함께 검색 할 경우

mycoll.find({ $text: { $search: "super"} })

나는 첫 번째 항목 (올바른) 취득.

: 내가하려고하는 경우 만 - 그러나 나는 또한 첫 번째 항목을 얻을으로 검색 "uper"할

mycoll.find({ $text: { $search: "uper"} })

나는 어떤 결과를 얻을니까.

내 질문: 결과의 발견 있도록 검색 문자열의 일부와 $ 텍스트를 사용하는 방법이 있다면? (예를 들어, '% uper %'에서의 MySQL 등)

주의 : 만 검색 정규식을 요청 해달라고 - 나는 $ 텍스트 검색에서 정규식 검색을 요청!

해결법

  1. ==============================

    1.그것은 $ 텍스트 연산자와 함께 할 수 없습니다.

    그것은 $ 텍스트 연산자와 함께 할 수 없습니다.

    텍스트 인덱스는 문자열 값이나 문자열 배열에 포함 된 조건을 생성하고 검색이 그 idexes에 기반을두고 있습니다.

    당신은 그룹 용어 문구에 있지만 그 중 일부를 취할 수 있습니다.

    $ 텍스트 연산자 참조 및 텍스트 인덱스 설명을 읽어보십시오.

  2. ==============================

    2.당신이 두 번째 예에서 일을하려고하는 것은 접두사 필드 foo는 당신의 수집 MYCOLL에서 검색 와일드 카드입니다. 이것은 TextSearch가 기능을 위해 설계된 것이 아닙니다 $ 텍스트 연산자와 함께 할 수 없습니다. 이 문제는 와일드 카드 접두사라도 인덱스 필드에 토큰 주어진 검색에 포함되지 않습니다. 다른 사람이 제안 그러나 당신은 양자 택일 정규식 검색을 수행 할 수 있습니다. 여기 내 연습은 다음과 같습니다

    당신이 두 번째 예에서 일을하려고하는 것은 접두사 필드 foo는 당신의 수집 MYCOLL에서 검색 와일드 카드입니다. 이것은 TextSearch가 기능을 위해 설계된 것이 아닙니다 $ 텍스트 연산자와 함께 할 수 없습니다. 이 문제는 와일드 카드 접두사라도 인덱스 필드에 토큰 주어진 검색에 포함되지 않습니다. 다른 사람이 제안 그러나 당신은 양자 택일 정규식 검색을 수행 할 수 있습니다. 여기 내 연습은 다음과 같습니다

    >db.mycoll.find()
    { "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
    { "_id" : ObjectId("53add9674dfbffa0471c6e8f"), "foo" : "your not so cool item" }
    > db.mycoll.find({ $text: { $search: "super"} })
    { "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
    > db.mycoll.count({ $text: { $search: "uper"} })
    0
    

    은 $ 텍스트 연산자 지원은 하나의 단어를 검색 할 하나 개 이상의 단어를 검색 또는 구문을 검색합니다. 당신이 원하는 검색의 종류는 지원되지 않습니다

    정규식 솔루션 :

    > db.mycoll.find({foo:/uper/})
    { "_id" : ObjectId("53add9364dfbffa0471c6e8e"), "foo" : "my super cool item" }
    > 
    

    당신의 마지막 질문에 대한 대답은 : MongoDB를에 MySQL의 스타일 % 슈퍼 %을 할 가능성이 가장 높은해야 할 것입니다 :

    db.mycoll.find( { foo : /.*super.*/ } );
    
  3. ==============================

    3.내가 코멘트 jasenkoh 솔루션 충분히 명성을 가지고 있지 않지만,이 명확하게이 상황에 대처하는 가장 좋은 방법입니다.

    내가 코멘트 jasenkoh 솔루션 충분히 명성을 가지고 있지 않지만,이 명확하게이 상황에 대처하는 가장 좋은 방법입니다.

    영업 상황에서, 내가 것 :

    db.mycoll.createIndex( { foo: "text" } )
    db.mycoll.createIndex( { foo: 1 } )
    db.mycoll.find({$or: [{$text: {$search: 'uper'}}, {foo: {$regex: 'uper'}}]})
    

    더 나은 성능 (그러나 약간 다른 결과)의 경우, 마지막 라인을 교체 :

    db.mycoll.find({$or: [{$text: {$search: 'uper'}}, {foo: {$regex: '^uper'}}]})
    
  4. ==============================

    4.그것은 / uper /와 함께 작동합니다.

    그것은 / uper /와 함께 작동합니다.

    자세한 내용은 http://docs.mongodb.org/manual/reference/operator/query/regex/를 참조하십시오.

    편집하다:

    의견의 요청에 따라 :

    이 솔루션은 반드시 실제로 영업 이익은 요청 것을 제공하는 것을 의미하지만, 그 문제를 해결하는 데 필요한 무엇을하지 않았다.

    $ 정규식 검색 텍스트 인덱스와 작업을하지 않기 때문에, 간단하지만 요청 된 수단을 사용하지 않는, 예상 된 결과를 제공해야하는 인덱스 필드를 통해 검색 정규식.

    사실,이 작업을 수행 할 매우 간단합니다 :

    db.collection.insert( {foo: "my super cool item"} )
    db.collection.insert( {foo: "your not so cool item"})
    db.collection.ensureIndex({ foo: 1 })
    db.collection.find({'foo': /uper/})
    

    우리에게 예상 된 결과를 제공합니다 :

    { "_id" : ObjectId("557f3ba4c1664dadf9fcfe47"), "foo" : "my super cool item" }
    

    인덱스를 효율적으로 사용하는 것을 보여줍니다에게 우리를 설명 추가 :

    {
        "queryPlanner" : {
            "plannerVersion" : 1,
            "namespace" : "test.collection",
            "indexFilterSet" : false,
            "parsedQuery" : {
                "foo" : /uper/
            },
            "winningPlan" : {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "filter" : {
                        "foo" : /uper/
                    },
                    "keyPattern" : {
                        "foo" : 1
                    },
                    "indexName" : "foo_1",
                    "isMultiKey" : false,
                    "direction" : "forward",
                    "indexBounds" : {
                        "foo" : [
                            "[\"\", {})",
                            "[/uper/, /uper/]"
                        ]
                    }
                }
            },
            "rejectedPlans" : [ ]
        },
        "serverInfo" : {
            // skipped
        },
        "ok" : 1
    }
    

    긴 이야기를 짧게하려면 : 아니오, 당신은 $ 텍스트 인덱스를 다시 사용할 수 없습니다,하지만 당신은 효율적으로 쿼리를 수행 할 수 있습니다. MongoDB의 검색을 사용하여 자동 완성 기능을 구현 작성과 마찬가지로, 하나는 아마 더 효율적 더 진짜 시간되는 비용으로, 인덱스에서 중복 및 불필요한 중지 단어를, 접근 방식을 줄일 /지도를 이용하여 제거하여이 될 수 있습니다.

  5. ==============================

    5.francadaval 말했듯이, 텍스트 인덱스 용어가 검색되어 있지만 정규식 및 텍스트 인덱스를 결합 할 경우, 당신은 잘해야합니다.

    francadaval 말했듯이, 텍스트 인덱스 용어가 검색되어 있지만 정규식 및 텍스트 인덱스를 결합 할 경우, 당신은 잘해야합니다.

    mycoll.find({$or: [ 
      { 
        $text: {
          $search: "super"
        }
      },
      {
        'column-name': {
          $regex: 'uper',
          $options: 'i'
      }
    ]})
    

    또한, 당신이 일반 인덱스 텍스트 인덱스가 아닌 컬럼에 적용했는지 확인하십시오.

  6. ==============================

    6.당신이 정규식과 함께 갈 경우 두 요구를 달성하기 위해, "고급형"가 아니라 "슈퍼 항목"에 대한 검색을 달성 $ 텍스트와 검색어 $ 정규식와 함께 또는 요청을 할 수 있습니다.

    당신이 정규식과 함께 갈 경우 두 요구를 달성하기 위해, "고급형"가 아니라 "슈퍼 항목"에 대한 검색을 달성 $ 텍스트와 검색어 $ 정규식와 함께 또는 요청을 할 수 있습니다.

    당신 인덱스 확인 텍스트 인덱싱 작업에 일반 인덱스를 모두 확인합니다.

  7. ==============================

    7.당신은 된 직후입니다 달성 할 수

    당신은 된 직후입니다 달성 할 수

    db.mycoll.find( {foo: { $regex :  /uper/i  } })
    

    여기에 '내가'옵션이며, 대소 문자를 구분 검색을 의미

  8. from https://stackoverflow.com/questions/24343156/mongodb-prefix-wildcard-fulltext-search-text-find-part-with-search-string by cc-by-sa and MIT license