Elastic Search에서 부분 일치를 수행하려면 어떻게 해야 합니까?
http://drive.google.com과 같은 링크가 있는데 링크에서 "google"을 대조하고 싶습니다.
다음과 같은 것이 있습니다.
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
그러나 이는 전체 텍스트가 '구글'인 경우에만 일치합니다(대소문자를 구분하지 않으므로 Google이나 GoGlE 등과 일치합니다).다른 문자열의 '구글'과 일치하려면 어떻게 해야 합니까?
요점은 사용하고 있는 Elastic Search regex에는 완전한 문자열 일치가 필요하다는 것입니다.
루센의 패턴은 항상 고정되어 있다.제공된 패턴은 문자열 전체와 일치해야 합니다.
임의의 줄 바꿈)와시키려면 , 「」( 「」, 「」)를 합니다..*
★★★★
match: { text: '.*google.*'}
^^ ^^
에서는 ES6+를 합니다.regexp
되어 있습니다.match
:
"query": {
"regexp": { "text": ".*google.*"}
}
줄 바꿈이 수 입니다: 줄 바꿈이 되다.match: { text: '(.|\n)*google(.|\n)*'}
끔찍한 ★★★★★★★★★★★★★★★★★★★★★★★★★★.(.|\n)*
regex Search에서 이 regex 플레이버는 Elastic Search를 허용하지 않습니다.regex regex는 Elastic Search를 .[\s\S]
회피책 또는 DOTALL/Single Line 플래그 중 하나."Lucene 정규 표현 엔진은 Perl과 호환되지 않지만 더 적은 범위의 연산자를 지원합니다."
단, 복잡한 패턴을 대조하지 않고 워드 경계 체크가 필요 없는 경우 와일드카드 검색만으로 서브스트링에 대한 regex 검색을 수행하는 것이 좋습니다.
{
"query": {
"wildcard": {
"text": {
"value": "*google*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
메모: 와일드카드 패턴도 입력 문자열 전체와 일치해야 합니다.
google*
다음 문자열로 시작하는 모든 문자열 찾기google
*google*
다음을 포함하는 모든 문자열을 찾습니다.google
*google
로 끝나는 모든 문자열을 찾습니다.google
또, 와일드 카드 패턴의 특수 문자의 유일한 쌍에 주의해 주세요.
?, which matches any single character
*, which can match zero or more characters, including an empty one
와일드카드 쿼리 사용:
'{"query":{ "wildcard": { "text.keyword" : "*google*" }}}'
부분 및 전체 텍스트 일치에 대해 다음 작업이 수행되었습니다.
"query" : {
"query_string" : {
"query" : "*searchText*",
"fields" : [
"fieldName"
]
}
에서 정규식을 비활성화하는 브레이크 체인지를 찾을 수 없습니다.match
match: { text: '.*google.*'}
Elasticsearch 6.2를 사용합니다.정가 ??
Regexp 동작:
"query": {
"regexp": { "text": ".*google.*"}
}
부분 일치에는 prefix 또는 match_prhase_prefix 중 하나를 사용할 수 있습니다.
보다 일반적인 솔루션에서는 다른 분석기를 사용하거나 독자적인 분석기를 정의하는 방법을 검토할 수 있습니다.http://drive.google.com를 토큰 "filename"과 "drive.google.com"으로 분할하는 표준 분석기를 사용하고 있을 것입니다.그래서 구글만 찾는 검색은 풀 drive.google.com과 비교하려고 하기 때문에 잘 되지 않습니다.
대신 단순 분석기를 사용하여 문서를 인덱싱하면 문서가 "http", "drive", "google" 및 "com"으로 분할됩니다.이를 통해 사용자는 이러한 조건 중 누구와도 개별적으로 일치할 수 있습니다.
사용, node.display 클라이언트의
tag_name은 필드 이름이고 value는 착신 검색 값입니다.
const { body } = await elasticWrapper.client.search({
index: ElasticIndexs.Tags,
body: {
query: {
wildcard: {
tag_name: {
value: `*${value}*`,
boost: 1.0,
rewrite: 'constant_score',
},
},
},
},
});
와일드카드 검색을 찾고 있습니다.공식 문서에 따르면 다음과 같이 수행할 수 있습니다.
query_string: {
query: `*${keyword}*`,
fields: ["fieldOne", "fieldTwo"],
},
와일드카드 검색은 개별 용어로 실행할 수 있습니다.단일 문자를 바꾸려면 ?를 사용하고 0 이상의 문자를 바꾸려면 *를 사용합니다.qu?ck bro*
다만, 주의해 주세요.
와일드카드 쿼리는 대량의 메모리를 사용하여 퍼포먼스가 매우 저하될 수 있습니다.쿼리 문자열 "a* b* c*"에 일치시키기 위해 몇 개의 용어를 쿼리해야 하는지 생각해 보십시오.
단어 시작 부분에 와일드카드(예: "*ing")를 허용하면 인덱스의 모든 용어를 일치시킬 경우에 대비하여 검토해야 하기 때문에 특히 중요합니다.선행 와일드카드를 비활성화하려면 allow_leading_wildcard를 false로 설정합니다.
언급URL : https://stackoverflow.com/questions/37709100/how-do-i-do-a-partial-match-in-elasticsearch
'programing' 카테고리의 다른 글
Mongoose에 입력 후 쿼리 중 (0) | 2023.03.26 |
---|---|
xml DOMDocument를 문자열로 변환 (0) | 2023.03.26 |
ui 라우터 - 공유 컨트롤러가 포함된 중첩된 보기 (0) | 2023.03.26 |
WooCommerce 주문변경현황 BACS처리 (0) | 2023.03.26 |
ng-repeat의 마지막 요소의 다른 클래스 (0) | 2023.03.26 |