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
'programing' 카테고리의 다른 글
| CSS에서 img 태그의 src 속성에 해당하는 것을 설정할 수 있습니까? (0) | 2023.05.17 |
|---|---|
| 엔티티에 대한 링크 - SQL "IN" 절 (0) | 2023.05.17 |
| PostgreSQL 새 줄 문자 (0) | 2023.05.17 |
| Bash 스크립트를 실행하지 않고 구문을 확인하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
| jQuery 유효성 검사: 기본 오류 메시지 변경 (0) | 2023.05.17 |