ElasticSearch 6.학습노트:16.전체 텍스트 검색

ElasticSearch 6.x 전문 검색 관련 내용 공식 문서:https://www.elastic.co/guide/en/elasticsearch/reference/6.1/full-text-queries.html
The high-level full text queries are usually used for running full text queries on full text fields like the body of an email. They understand how the field being queried is analyzed and will apply each field’s analyzer (or search_analyzer) to the query string before executing. 고급 전체 텍스트 검색은 일반적으로 전체 텍스트 필드(예를 들어 전자 우편 본문)에서 전체 텍스트 검색을 실행하는 데 사용된다.그들은 조회된 필드를 분석하는 방법을 알고 있으며, 실행하기 전에 모든 필드의 분석기 (또는search_analyzer) 를 조회 문자열에 적용합니다.

16.1 match 질의


(1) 예제
GET website/_search
{
  "query": {
    "term": {
        "title": "centos "
    }
  }
}
{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

(2) and 조작부호
GET website/_search
{
  "query": {
    "match": {
        "title":{
          "query":"centos ",
          "operator":"and"
        }
    }
  }
}
{
  "took": 36,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "3",
        "_score": 0.5753642,
        "_source": {
          "title": "CentOS gcc",
          "author": " ",
          "postdate": "2016-12-25",
          "url": "http://url/53868915"
        }
      }
    ]
  }
}

(3) or 조작부호
GET website/_search
{
  "query": {
    "match": {
        "title":{
          "query":"centos ",
          "operator":"or"
        }
    }
  }
}
{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.9227539,
    "hits": [
      {
        "_index": "website",
        "_type": "blog",
        "_id": "6",
        "_score": 0.9227539,
        "_source": {
          "title": "CentOS yum ",
          "author": " ",
          "postdate": "2016-12-30",
          "url": "http://url/53946911"
        }
      },
      {
        "_index": "website",
        "_type": "blog",
        "_id": "3",
        "_score": 0.5753642,
        "_source": {
          "title": "CentOS gcc",
          "author": " ",
          "postdate": "2016-12-25",
          "url": "http://url/53868915"
        }
      }
    ]
  }
}

16.2 match_phrase 쿼리 (구문 쿼리)


Like the match query but used for matching exact phrases or word proximity matches. matchquery와 유사하지만 정확한 단어와 일치하는 것을 단어 조회라고 할 수 있습니다.
match_phrase 조회는 조회 내용을 단어로 나눌 수 있으며, 단어 구분기는 사용자 정의할 수 있으며, 문서에서 다음 두 가지 조건을 동시에 만족시켜야 검색할 수 있습니다.
  • 단어를 나누면 모든 단어 항목이 이 필드에 나타납니다
  • 필드의 단어 순서는 일치해야 한다

  • (1) 인덱스 만들기, 데이터 삽입
    PUT test
    
    PUT test/hello/1
    { "content":"World Hello"}
    
    PUT test/hello/2
    { "content":"Hello World"}
    
    PUT test/hello/3
    { "content":"I just said hello world"}

    (2) match_ 사용phrase 조회 "hello world"
    GET test/_search
    {
      "query": {
        "match_phrase": {
          "content": "hello world"
        }
      }
    }

    위의 두 문서가 일치하여 검색됩니다.첫 번째 문서의 어순은 조회된 내용과 일치하지 않기 때문에 일치하지 않습니다.
    {
      "took": 21,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 0.5753642,
        "hits": [
          {
            "_index": "test",
            "_type": "hello",
            "_id": "2",
            "_score": 0.5753642,
            "_source": {
              "content": "Hello World"
            }
          },
          {
            "_index": "test",
            "_type": "hello",
            "_id": "3",
            "_score": 0.5753642,
            "_source": {
              "content": "I just said hello world"
            }
          }
        ]
      }
    }

    16.3 match_phrase_prefix 조회 (접두사 조회)


    https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-match-query-phrase-prefix.html The match_phrase_prefix is the same as match_phrase, except that it allows for prefix matches on the last term in the text. match_phrase_prefix 및 match_phrase는 같지만, 텍스트의 마지막 단어의 접두사가 일치하도록 허용합니다.즉, match_phrase가 확장되었습니다. 검색 내용의 마지막 단어는 접두사와 일치하기만 하면 됩니다.
    GET test/_search
    {
      "query": {
        "match_phrase_prefix": {
          "content": "hello wor"
        }
      }
    }
    {
      "took": 10,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 0.5753642,
        "hits": [
          {
            "_index": "test",
            "_type": "hello",
            "_id": "1",
            "_score": 0.5753642,
            "_source": {
              "content": "Hello World"
            }
          },
          {
            "_index": "test",
            "_type": "hello",
            "_id": "3",
            "_score": 0.5753642,
            "_source": {
              "content": "I just said hello world"
            }
          }
        ]
      }
    }

    16.4 multi_match 질의


    https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-multi-match-query.html
    The multi_match query builds on the match query to allow multi-field queries. multi_match 조회는 match 조회의 업그레이드 버전으로 여러 필드 검색에 사용됩니다.[예] "centos"조회, 검색 필드는 title과 abstract
    GET website/_search
    {
      "query": {
        "multi_match": {
          "query": "centos",
          "fields": ["title","abstract"]
        }
      }
    }

    검색 결과는 다음과 같습니다.
    {
      "took": 4,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 5,
        "max_score": 0.9227539,
        "hits": [
          {
            "_index": "website",
            "_type": "blog",
            "_id": "6",
            "_score": 0.9227539,
            "_source": {
              "title": "CentOS yum ",
              "author": " ",
              "postdate": "2016-12-30",
              "abstract": "CentOS yum ",
              "url": "http://url/53946911"
            }
          },
          {
            "_index": "website",
            "_type": "blog",
            "_id": "2",
            "_score": 0.41360322,
            "_source": {
              "title": "watchman ",
              "author": " ",
              "postdate": "2016-12-23",
              "abstract": "CentOS7.x watchman ",
              "url": "http://url.cn/53844169"
            }
          },
          {
            "_index": "website",
            "_type": "blog",
            "_id": "3",
            "_score": 0.2876821,
            "_source": {
              "title": "CentOS gcc",
              "author": " ",
              "postdate": "2016-12-25",
              "abstract": "CentOS gcc",
              "url": "http://url/53868915"
            }
          },
          {
            "_index": "website",
            "_type": "blog",
            "_id": "7",
            "_score": 0.20055373,
            "_source": {
              "title": " Ember ",
              "author": " ",
              "postdate": "2016-12-30",
              "abstract": "CentOS Ember ",
              "url": "http://url/53947507"
            }
          },
          {
            "_index": "website",
            "_type": "blog",
            "_id": "1",
            "_score": 0.1671281,
            "_source": {
              "title": "Ambari ",
              "author": " ",
              "postdate": "2016-12-21",
              "abstract": "CentOS7.x Ambari2.4 ",
              "url": "http://url.cn/53788351"
            }
          }
        ]
      }
    }

    문서의 제목과 abstract 필드가 일치하면 검색됩니다.

    16.5 common_terms 쿼리 (상용어 쿼리)


    https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-common-terms-query.html(1) 사용 정지어의 일부 단어는 텍스트에 나타나는 빈도가 매우 높지만 텍스트가 가지고 있는 정보에 기본적으로 영향을 미치지 않는다.예를 들어 영어의 a, an, the, of, 중국어의'의','됐어','착','네', 문장부호 등이다.텍스트가 단어를 나눈 후에 사용하지 않는 단어는 통상적으로 필터되어 색인이 되지 않는다.검색할 때, 사용자의 검색에 사용 정지어가 포함되면, 검색 시스템도 그것을 필터합니다. 사용자가 입력한 검색 문자열도 단어 처리를 해야 하기 때문입니다.사용 정지어를 제외하면 색인을 만드는 속도를 가속화하고 색인 라이브러리 파일의 크기를 줄일 수 있습니다.
    (2) 정용어가 문서 평점에 미치는 영향은 크지 않지만 때때로 정용어는 여전히 중요한 의미를 가지기 때문에 정용어를 제거하는 것은 분명히 적합하지 않다.사용 정지어를 제거하면'happy'와'not happy'를 구분할 수 없고'to be or not to be'는 인덱스할 수 없으며 검색의 정확도가 떨어진다.
    (3)common_terms 검색은 검색어를 나눈 후의 단어 항목(예를 들어 low frequency terms, 저주파 단어)과 중요하지 않은 단어(high frequency terms which would previously have beenstopwords, 고주파 정용사)로 나누는 해결 방안을 제공합니다.검색할 때 먼저 중요한 단어와 일치하는 문서를 검색한 다음에 두 번째 검색을 실행하여 평점이 비교적 작은 고주파 단어를 검색한다.Terms are allocated to the high or low frequency groups based on the cutoff_frequency, which can be specified as an absolute frequency (>=1) or as a relative frequency (0.0 .. 1.0).단어 항목이 고주파어인지 저주파어인지 cutoff_frequency는 밸브 값을 설정합니다. 값은 절대 주파수(>=1) 또는 상대 주파수(0.0~1.0)
    GET website/_search
    {
        "query": {
            "common": {
                "title": {
                    "query": "to be",
                    "cutoff_frequency": 0.0001,
                    "low_freq_operator": "and"
                }
            }
        }
    }
    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 2.364739,
        "hits": [
          {
            "_index": "website",
            "_type": "blog",
            "_id": "9",
            "_score": 2.364739,
            "_source": {
              "title": "to be or not to be",
              "author": "somebody",
              "postdate": "2018-01-03",
              "abstract": "to be or not to be,that is the question",
              "url": "http://url/63991802"
            }
          }
        ]
      }
    }

    16.5 query_string 조회


    query_string 조회는 Lucence 조회 문장과 밀접하게 결합되어 하나의 조회 문장에서 여러 가지 특수한 조건 키워드를 사용할 수 있습니다. Lucence 조회 문법에 익숙한 사용자가 사용하는 것을 권장합니다.

    16.6 simple_query_string


    https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-simple-query-string-query.html분석 오류가 발생했을 때 이상을 던지지 않고 검색이 잘못된 부분을 버립니다.
    GET website/_search
    {
      "query": {
        "simple_query_string" : {
            "query": "\"fried eggs\" +(eggplant | potato) -frittata",
            "fields": ["title^5", "abstract"],
            "default_operator": "and"
        }
      }
    }
    {
      "took": 20,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
      }
    }

    좋은 웹페이지 즐겨찾기