elasticsearch - 부분 일치

13030 단어 elasticsearch

elasticsearch - 부분 일치


참고 자료:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

구문 일치


짧은 Quick brown fox와 일치하는 문서로 인정되면 다음과 같은 요구 사항을 충족해야 합니다.
  • quick,brown,fox는 모두 필드에 나타나야 합니다..
  • 브라운의 위치는 퀵의 위치보다 클 것이다 1..
  • fox의 위치는 퀵의 위치보다 크겠지 2..
  • GET /my_index/my_type/_search
    {
        "query": {
            "match_phrase": {
                "title": "quick brown fox"
            }
        }
    }
    
    or
    
    "match": {
        "title": {
            "query": "quick brown fox",
            "type":  "phrase"
        }
    }
    
    

    위치 문제

    GET /my_index/my_type/_search
    {
        "query": {
            "match_phrase": {
                "title": {
                    "query": "quick fox",
                    "slop":  1
                }
            }
        }
    }
    

    slop은 단어가 중어와 일치하는 간격과 순서를 결정합니다.
                Pos 1         Pos 2         Pos 3
    -----------------------------------------------
    Doc:        quick         brown         fox
    -----------------------------------------------
    Query:      fox           quick
    Slop 1:     fox|quick  ↵// fox quick  
    Slop 2:     quick      ↳  fox
    Slop 3:     quick                 ↳     fox
    
    
    

    다중 값 필드

    PUT /my_index/groups/1
    {
        "names": [ "John Abraham", "Lincoln Smith"]
    }
    

    구문 조회
    GET /my_index/groups/_search
    {
        "query": {
            "match_phrase": {
                "names": "Abraham Lincoln"
            }
        }
    }
    

    포지션은 다음과 같습니다.
  • position 1:John
  • position 2:Abraham
  • position 3:Lincoln
  • position 4:Smith

  • 그러면 여기에 잘못된 검색 결과가 나타날 것입니다. 이 기록은 명중될 것입니다
    해결 방법
        "properties": {
            "names": {
                "type":                "string",
                "position_increment_gap": 100
            }
        }
    }
    

    이때 포지션
  • position 1:John
  • position 2:Abraham
  • position 103:Lincoln
  • position 104:Smith

  • 이때 슬롯이 100이어야 적중됩니다.

    slop의 점수(가까울수록 좋다)


    네가 slop에 큰 값을 주었을 때, 단어가 가까울수록 점수가 높아진다
    POST /my_index/my_type/_search
    {
       "query": {
          "match_phrase": {
             "title": {
                "query": "quick dog",
                "slop":  50 
             }
          }
       }
    }
    
    
    {
      "hits": [
         {
            "_id":      "3",
            "_score":   0.75, 
            "_source": {
               "title": "The quick brown fox jumps over the quick dog"
            }
         },
         {
            "_id":      "2",
            "_score":   0.28347334, 
            "_source": {
               "title": "The quick brown fox jumps over the lazy dog"
            }
         }
      ]
    }
    

    구문 일치의 관련성 범위를 높이다

    GET /my_index/my_type/_search
    {
      "query": {
        "bool": {
          "must": {
            "match": { 
              "title": {
                "query":                "quick brown fox",
                "minimum_should_match": "30%"
              }
            }
          },
          "should": {
            "match_phrase": { 
              "title": {
                "query": "quick brown fox",
                "slop":  50
              }
            }
          }
        }
      }
    }
    
  • 최소 30%의 일치하는 문서를 찾아라
  • should의 단어 일치를 통해 점수를 증가합니다

  • 단어가 일치하기 때문에 모든 단어가 나타나야 하고 그들의 위치도 관련 요구가 있기 때문에 범위를 높이기 위해bool조작을 통해 실현한다.

    분석 조회와 인근 조회의 최적화

  • 결과 재평점

  • 이전 장에서 우리는 문서를 결과 목록에서 추가하거나 제외하는 대신 인접 조회를 사용하여 관련도를 조정하는 것에 대해 토론했다.하나의 조회는 수천 수만의 결과와 일치할 수 있지만, 우리 사용자들은 결과의 몇 페이지만 흥미를 느낄 가능성이 높다.
    간단한 match 검색은 검색 단어가 포함된 모든 문서를 정렬을 통해 결과 목록 앞에 놓았습니다.사실상, 우리는 이 맨 위 문서들을 다시 정렬해서 단어 조회와 일치하는 문서에 대한 추가 관련도를 업그레이드하고 싶을 뿐이다.
    Search API는 재채점을 통해 이 기능을 명확하게 지원합니다.재평가 단계는 값이 더 높은 평가 알고리즘을 지원합니다. 예를 들어 phrase 조회 등은 단지 모든 점수에서 전 K개의 결과를 얻기 위해서입니다.그리고 그것들의 최신 평점에 따라 다시 정렬됩니다.
    이 요청은 다음과 같습니다.
    GET /my_index/my_type/_search
    {
        "query": {
        //match  ,  TF/IDF  。
            "match": {  
                "title": {
                    "query":                "quick brown fox",
                    "minimum_should_match": "30%"
                }
            }
        },
        "rescore": {
           //window_size  。
            "window_size": 50, 
            "query": {  
            //	 , 。
                "rescore_query": {
                    "match_phrase": {
                        "title": {
                            "query": "quick brown fox",
                            "slop":  50
                        }
                    }
                }
            }
        }
    }
    

    관련어


    [“sue”, “ate”, “the”, “alligator”] [“sue ate”, “ate the”, “the alligator”] [“sue ate the”, “ate the alligator”]
    DELETE /my_index
    
    PUT /my_index
    {
        "settings": {
            "number_of_shards": 1,  
            "analysis": {
                "filter": {
                    "my_shingle_filter": {
                        "type":             "shingle",
                        "min_shingle_size": 2, 
                        "max_shingle_size": 2, 
                        "output_unigrams":  false   
                    }
                },
                "analyzer": {
                    "my_shingle_analyzer": {
                        "type":             "custom",
                        "tokenizer":        "standard",
                        "filter": [
                            "lowercase",
                            "my_shingle_filter" 
                        ]
                    }
                }
            }
        }
    }
    

    다중 필드
    PUT /my_index/_mapping/my_type
    {
        "my_type": {
            "properties": {
                "title": {
                    "type": "string",
                    "fields": {
                        "shingles": {
                            "type":     "string",
                            "analyzer": "my_shingle_analyzer"
                        }
                    }
                }
            }
        }
    }
    
    GET /my_index/my_type/_search
    {
       "query": {
          "bool": {
             "must": {
                "match": {
                   "title": "the hungry alligator ate sue"
                }
             },
             "should": {
                "match": {
                   "title.shingles": "the hungry alligator ate sue"
                }
             }
          }
       }
    }
    

    성능
    shingles는 단어 조회보다 유연할 뿐만 아니라 성능도 좋다.shingles 검색은 간단한 match 검색만큼 효율적이며, 매번 검색할 때마다 단어 검색의 대가를 치르지 않습니다.단지 색인 기간에 더 많은 단어가 색인되어야 하기 때문에 약간의 대가를 치르게 될 뿐, 이것은 shingles가 있는 필드가 더 많은 디스크 공간을 차지한다는 것을 의미한다.그러나 대부분의 응용 프로그램은 한 번 쓰고 여러 번 읽기 때문에 색인 기간에 우리의 검색 속도를 최적화하는 것은 의미가 있다.

    부분 일치


    select * from t1 where t1.a like ‘%tom%’

    prefix 접두사 조회

    GET /my_index/address/_search
    {
        "query": {
            "prefix": {
                "postcode": "W1"
            }
        }
    }
    
    

    쿼리는 접두사 일치를 지원하기 위해 다음과 같은 작업을 수행합니다.
  • 단어 목록을 스캔하고 W1로 시작하는 첫 번째 단어를 찾습니다..
  • 연관된 문서 ID 수집..
  • 다음 단어로 이동..
  • 만약 이 단어도 W1로 시작한다면, 조회는 다음 단어가 W1로 시작하지 않을 때까지 두 번째 단계로 돌아가서 다시 실행합니다

  • 필드에 있는 단어의 집합이 매우 시간적이면 안심하고 사용할 수 있지만, 신축성이 좋지 않아서, 우리의 집단에 많은 압력을 줄 수 있다.비교적 긴 접두사를 사용하여 이런 영향을 제한하고 방문해야 할 양을 줄일 수 있다.

    와일드카드


    ? 모든 문자 일치, * 0 개 이상의 문자 일치
    GET /my_index/address/_search
    {
        "query": {
            "wildcard": {
                "postcode": "W?F*HW" 
            }
        }
    }
    

    이 정규 표현식 요구어는 반드시 W로 시작해서 0에서 9 사이의 모든 숫자를 따라가서 하나 이상의 다른 문자를 받아야 한다.
    
    GET /my_index/address/_search
    {
        "query": {
            "regexp": {
                "postcode": "W[0-9].+" 
            }
        }
    }
    

    주의:wildcard와regexp 조회의 작업 방식은prefix 조회와 완전히 같습니다. 성능 문제
    이 부분의 일치는 모두 단어 조회이고 모두 단어 항목에 기초한 조회이다.

    입력 즉시 조회 (입력 프롬프트 관련 검색)


    구문 접두사 일치
    {
        "match_phrase_prefix" : {
            "brand" : {
                "query": "walker johnnie bl", 
                "slop":  10
            }
        }
    }
    
  • johnnie
  • 워커를 따라가세요
  • bl로 시작하는 단어를 따라가세요
  • //explain
    "johnnie walker bl*"
    

    매개변수 max_expansions는 접두사와 일치할 수 있는 단어의 수량을 제어합니다. 접두사bl과 일치하는 첫 번째 단어를 먼저 찾은 다음, 그 단어와 일치하는 단어를 순서대로 찾습니다. (알파벳순으로) 더 이상 일치하는 단어가 없거나 max_expansions 때 끝납니다.
    사용자가 한 글자를 더 입력할 때마다 이 검색은 다시 한 번 실행되기 때문에 검색은 빠르다. 만약 첫 번째 결과집이 사용자가 원하는 것이 아니라면, 그들은 만족스러운 결과를 찾을 때까지 계속 입력할 것이다.
    {
        "match_phrase_prefix" : {
            "brand" : {
                "query":          "johnnie walker bl",
                "max_expansions": 50
            }
        }
    }
    

    Ngrams - 부분 일치


    quick
  • 길이 1(unigram): [q, u, i, c, k]
  • 길이 2(bigram): [qu,ui,ic,ck]
  • 길이 3(trigram): [qui, uic,ick]
  • 길이 4(four-gram): [quic, uick]
  • 길이 5(five-gram): [quick]

  • 색인
    token 
    {
        "filter": {
            "autocomplete_filter": {
                "type":     "edge_ngram",
                "min_gram": 1,
                "max_gram": 20
            }
        }
    }
    
     
    {
        "analyzer": {
            "autocomplete": {
                "type":      "custom",
                "tokenizer": "standard",
                "filter": [
                    "lowercase",
                    "autocomplete_filter" 
                ]
            }
        }
    }
    
     
    PUT /my_index
    {
        "settings": {
            "number_of_shards": 1, 
            "analysis": {
                "filter": {
                    "autocomplete_filter": { 
                        "type":     "edge_ngram",
                        "min_gram": 1,
                        "max_gram": 20
                    }
                },
                "analyzer": {
                    "autocomplete": {
                        "type":      "custom",
                        "tokenizer": "standard",
                        "filter": [
                            "lowercase",
                            "autocomplete_filter" 
                        ]
                    }
                }
            }
        }
    }
    
     
    PUT /my_index/_mapping/my_type
    {
        "my_type": {
            "properties": {
                "name": {
                    "type":     "string",
                    "analyzer": "autocomplete"
                }
            }
        }
    }
    
    
     
    GET /my_index/my_type/_search
    {
        "query": {
            "match": {
                "name": {
                    "query":    "brown fo",
                    "analyzer": "standard" 
                }
            }
        }
    }
    
    

    복합어의 사용
    PUT /my_index
    {
        "settings": {
            "analysis": {
                "filter": {
                    "trigrams_filter": {
                        "type":     "ngram",
                        "min_gram": 3,
                        "max_gram": 3
                    }
                },
                "analyzer": {
                    "trigrams": {
                        "type":      "custom",
                        "tokenizer": "standard",
                        "filter":   [
                            "lowercase",
                            "trigrams_filter"
                        ]
                    }
                }
            }
        },
        "mappings": {
            "my_type": {
                "properties": {
                    "text": {
                        "type":     "string",
                        "analyzer": "trigrams" 
                    }
                }
            }
        }
    }
    
    GET /my_index/my_type/_search
    {
        "query": {
            "match": {
                "text": {
                    "query":                "Gesundheit",
                    "minimum_should_match": "80%"
                }
            }
        }
    }
    

    참고 자료:
    https://www.elastic.co/guide/cn/elasticsearch/guide/current/scoring-theory.html

    좋은 웹페이지 즐겨찾기