programing

Elastic Search를 사용하여 중첩된 객체를 검색하는 방법

muds 2023. 3. 22. 22:17
반응형

Elastic Search를 사용하여 중첩된 객체를 검색하는 방법

네, 아직까지는 잘 모르겠어요.누군가 통찰력을 제공해주길 바라면서요

아래 문서를 참조하면 비디오 제목에 "테스트"가 있는 모든 문서를 검색하려면 어떻게 해야 합니까?HTTP API를 사용하고 있습니다.(기본적으로 탄력적인 검색으로 중첩된 오브젝트를 검색하려면 어떻게 해야 하나요? 밖에 의사가 있을 거란 건 알지만, 아직 찾을 수 없어요.

[{
    id:4635,
    description:"This is a test description",
    author:"John",
    author_id:51421,
    video: {
        title:"This is a test title for a video",
        description:"This is my video description",
        url:"/url_of_video"
    }
},
{
    id:4636,
    description:"This is a test description 2",
    author:"John",
    author_id:51421,
    video: {
        title:"This is an example title for a video",
        description:"This is my video description2",
        url:"/url_of_video2"
    }
},
{
    id:4637,
    description:"This is a test description3",
    author:"John",
    author_id:51421,
    video: {
        title:"This is a test title for a video3",
        description:"This is my video description3",
        url:"/url_of_video3"
    }
}]

비디오를 반드시 중첩할 필요는 없습니다.일반 필드로 매핑할 수 있습니다.그 말은 곧 저장될 거라는 거죠

'video:title': "This is a test title for a video3",
'video:description':"This is my video description3",
'video:url':"/url_of_video3"

검색하면 돼요.video.title:'test'.

중첩된 항목이 여러 개 있고 중첩된 항목에 대해서만 쿼리를 작성하려는 경우 중첩된 필드가 유용합니다.예를 들어, 이 데이터가 있는 경우

[{
    id:4635,
    description:"This is a test description",
    author:"John",
    author_id:51421,
    video: [
      {
        title:"This is a test title for a video",
        description:"This is my video description",
        url:"/url_of_video"
      },
      {
        title:"This is an example title for a video",
        description:"This is my video description2",
        url:"/url_of_video2"
      }
    ]
},
{
    id:4637,
    description:"This is a test description3",
    author:"John",
    author_id:51421,
    video: [
      {
        title:"This is a test title for a video3",
        description:"This is my video description3",
        url:"/url_of_video3"
      }
    ]
}]

.video.title: 'test' and video.description: 'description2'가 네스트 되어 않은 경우,수test.또, 「 」는, 「 」입니다.description2두 번째, 하지만 모든 비디오 필드에는 둘 다 있습니다.)

네스트된 각, 「 」는 「 」입니다.video.title: 'test' and video.description: 'description2'것도 않는다video.title: 'example' and video.description: 'description2'하나의 결과가 반환됩니다.

네, 드디어 이 페이지를 찾았습니다(이미 문서에 시간이 더 걸렸을 것입니다).비디오를 유지하는 속성을 type:nested로 설정하고 나서 네스트된 쿼리를 사용합니다.

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html

이게 앞으로 누군가를 도울 수 있기를 바랍니다.

Rest API URL 포맷으로 하고 싶은 경우

/_search? pretty&q=비디오.제목 : *test*

..keyword중첩된 개체의 이름이 고유한 경우 접미사를 지정합니다.

{
        'query': {
            'term': {
                'title.keyword': "This is a test title for a video"               
            }
        }
}

첫 번째 입력 예시와 일치해야 합니다.에 주의:video어디에도 않습니다.은, 「」를 합니다.이것은, 다음의 모든 오브젝트와 일치합니다.title서브 오브젝트

보다 일반적인 답변을 제시하려면:

  • 한 번에 하나의 필드를 검색할 경우 개체(네스트 없음) 사용합니다.내부적으로는 다음과 같이 필드가 평평하기 때문입니다.

Elastic Search의 객체

  • 여러 필드를 검색해야 하는 경우(예: nested)를 사용합니다.title:test AND description:my오브젝트는 경계에 신경 쓰지 않기 때문입니다.한편, 중첩된 필드는 후드 아래에 별도의 Lucene 문서를 생성하며, Lucene의 BlockJoin을 통해 빠르게 결합됩니다.

Elastic Search의 중첩된 필드

  • 중첩된 문서를 업데이트하면 전체 앙상블이 업데이트되므로 여러 필드를 검색하고 하위 문서를 자주 업데이트하는 경우 상위-하위 관계(다른 Elasticsearch 문서 간)를 사용합니다.기본적으로 쿼리는 후드 아래에서 다음 두 단계로 실행되므로 쿼리 성능과 업데이트 성능을 교환할 경우

Elastic Search has-child 쿼리

주의: 위의 도면은 Sematext의 Elasticsearch 트레이닝 클래스(공개:이러한 수업을 실시하고 있습니다).

스키마:

  private schema = {
    id: {
      type: 'integer',
    },
    name: {
      type: 'text',
    },
    tags: {
      type: 'nested',
      properties: {
        id: {
          type: 'integer',
        },
        name: {
          type: 'keyword',
          normalizer: 'useLowercase',
        },
      },
    },
  }

문서 구조는

id: 38938
name: "summer fruits"
tags:[
   {
    id : 73
    name: "Grapes"
   },
  {
    id : 74
    name: "Pineapple"
   }
]

검색 쿼리:

    const { tags } = req.body;

    const { body } = await elasticWrapper.client.search({
        index: ElasticIndexs.Fruits,
        pretty: true,
        filter_path: 'hits.hits._source*',
        body: {
          query: {
            bool: {
              must: tags.map((ele: { name: string }) => {
                return {
                  nested: {
                    path: 'tags',
                    query: {
                      match: {
                        'tags.name': ele.name,
                      },
                    },
                  },
                };
              }),
            },
          },
        },
      });

언급URL : https://stackoverflow.com/questions/8140651/how-to-search-nested-objects-with-elasticsearch

반응형