programing

mongoDB 접두사 와일드카드: 전체 텍스트 검색($text) 검색 문자열이 있는 부분 찾기

iphone6s 2023. 5. 17. 22:35
반응형

mongoDB 접두사 와일드카드: 전체 텍스트 검색($text) 검색 문자열이 있는 부분 찾기

저는 몽고드브를 가지고 있습니다.$text-Index그리고 다음과 같은 요소들이 있습니다.

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

검색을 사용할 경우

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

저는 첫 번째 항목(정답)을 받았습니다.

하지만 첫 번째 항목을 얻기 위해 "상부"로 검색하고 싶습니다. 하지만 시도하면:

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

저는 아무런 결과도 얻지 못했습니다.

내 질문:$text를 사용하여 검색 문자열의 일부로 결과를 찾는 방법이 있습니까?(예: 예를 들어'%uper%'mysql)

주의:정규식 전용 검색을 요청하지 않습니다. $text-search 내에서 정규식 검색을 요청합니다!

로는 할 수 없습니다.$text교환입니다.

텍스트 색인은 문자열 값 또는 문자열 배열에 포함된 용어로 작성되며 검색은 해당 색인을 기반으로 합니다.

구문에 대한 용어만 그룹화할 수 있으며 일부만 그룹화할 수 없습니다.

연산자 참조 및 텍스트 색인 설명을 읽습니다.

텍스트 색인과 정규식을 모두 사용하는 것이 가장 좋습니다.
인덱스는 속도 성능이 뛰어나지만 정규식만큼 많은 문서와 일치하지는 않습니다.
정규식은 인덱스가 충분한 결과를 반환하지 않을 경우 폴백을 허용합니다.

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' } }
  ]
});

두 번째 예제에서 수행하려는 작업은 컬렉션의 접두사 와일드카드 검색입니다.mycoll현장에서foo이것은 텍스트 검색 기능을 위해 설계된 것이 아니며 이 기능을 사용할 수 없습니다.$text교환입니다.이 동작에는 인덱싱된 필드의 지정된 토큰에 대한 와일드카드 접두사 검색이 포함되지 않습니다.그러나 다른 사용자가 제안한 대로 정규식 검색을 수행할 수도 있습니다.다음은 제 소개입니다.

>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

$text연산자는 단일 단어 검색, 하나 이상의 단어 검색 또는 구문 검색을 지원합니다.원하는 검색 유형이 지원되지 않습니다.

정규식 솔루션:

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

당신의 마지막 질문에 대한 대답: mysql 스타일을 하는 것.%super%mongoDB에서는 다음을 수행해야 할 가능성이 높습니다.

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

와 함께 작동해야 합니다./uper/.

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

편집:

의견의 요청에 따라:

해결책은 OP가 요청한 것을 실제로 제공하기 위한 것이 아니라 그가 문제를 해결하기 위해 필요한 것을 제공하기 위한 것이었습니다.

때부터$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
}

간단히 말하자면, 아니요, 재사용할 수 없습니다.$text인덱스를 사용할 수 있지만 쿼리를 효율적으로 수행할 수 있습니다.MongoDB 검색을 사용한 자동 완성 기능 구현에서 설명한 것처럼 맵/축소 접근 방식을 사용하여 중복성 및 불필요한 중지 단어를 인덱스에서 제거함으로써 더 이상 실시간이 아닌 비용으로 훨씬 더 효율적일 수 있습니다.

말했듯이 텍스트 이지만 francadaval, francadaval, francadabal, francadabal을 조합하면 합니다.regex그리고.text-index당신은 잘해야 합니다.

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

또한 텍스트 색인이 아닌 일반 색인이 열에 적용되었는지 확인합니다.

regex를 사용하면 "super cool"을 검색할 수 있지만 "super item"은 검색할 수 없습니다. 검색어에 $text와 $regex를 사용하여 요청을 수행하거나 요청을 수행할 수 있습니다.

텍스트 인덱싱과 일반 인덱싱이 모두 작동하는지 확인합니다.

당신은 이를 달성할 수 있었습니다.

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

여기서 'i'는 대소문자를 구분하지 않는 검색을 나타내는 옵션입니다.

언급URL : https://stackoverflow.com/questions/24343156/mongodb-prefix-wildcard-fulltext-search-text-find-part-with-search-string

반응형