본문 바로가기
개발/ALGOLIA

알고리아 Managing Results(3-35)

by dev_caleb 2022. 4. 27.
728x90

https://www.algolia.com/doc/guides/managing-results/refine-results/grouping/how-to/grouping-by-attribute/

 

How to group results | Algolia

Grouping repeated data with Algolia's Distinct feature, by merging records into distinct groups, aggregating results, and flattening hierarchies.

www.algolia.com

 

Algolia works differently than relational databases. When fetching data from a database, you can select what you need, perform complex operations to aggregate data from different tables together, and get data in a format that’s already close to how you want to display it on your front end. With Algolia, every time you have a match within one or more of your records, the engine returns the full records ranked by relevance.

Algolia는 관계형 데이터베이스와 다르게 작동합니다. 데이터베이스에서 데이터를 가져올 때 필요한 항목을 선택하고, 복잡한 작업을 수행하여 서로 다른 테이블의 데이터를 함께 집계하며, 데이터를 프런트 엔드에 표시하는 방식에 이미 가까운 형식으로 데이터를 가져올 수 있습니다. Algolia를 사용하면 하나 이상의 레코드 내에서 일치할 때마다 관련성별로 순위가 매겨진 전체 레코드가 반환됩니다.

 

Sometimes your data contains records that are subparts of a larger record. This can happen with a blog article that is broken up into one paragraph per record. It can also happen when several records share a common source, as in a hierarchy or one-to-many relationship. A good example of this is with job openings, where companies offer multiple job offers.

데이터에 더 큰 레코드의 하위 부분인 레코드가 포함되어 있는 경우도 있습니다. 이 문제는 레코드당 하나의 단락으로 나누어진 블로그 기사에서 발생할 수 있습니다. 계층 구조나 일대다 관계에서와 같이 여러 레코드가 공통 소스를 공유하는 경우에도 발생할 수 있습니다. 이것의 좋은 예는 기업들이 여러 가지 일자리를 제공하는 구인공고이다.

 

As you’ll see, the solution is to flatten records and repeat some data. In the job offer example, you only want to show the most relevant 1 or 3 offers per company, leaving room for other companies. Let’s see how to do this.

보시다시피, 이 솔루션은 레코드를 평평하게 만들고 일부 데이터를 반복하는 것입니다. 일자리 제안 예제에서는 회사당 가장 관련성이 높은 1개 또는 3개의 제안만 표시하려고 하므로 다른 회사에 여지를 남겨 둡니다. 어떻게 하는지 봅시다.

Dataset Example

Before#

If we took a traditional approach for structuring our records, the dataset could look like this:

[
  {
    "company": "Twilio",
    "job_openings": [
      "Staff Software Engineer - Cloud Platform",
      "Lead Front End Engineer",
      "Senior Data Engineer",
      "Senior Software Engineer, Developer Experience"
    ]
  },
  {
    "company": "Algolia",
    "job_openings": [
      "Full-Stack Software Engineer",
      "Frontend Engineer",
      "Open Source Software Engineer (JavaScript)",
      "Senior Software Engineer - Core API",
      "Senior Systems Engineer - SRE"
    ]
  }
]

 

The problem with this structure is that whenever you have a match for any opening, the engine returns the full record for the company. If you want to show the best match per company, this data structure doesn’t work.

If you want to show a limited number of job openings per company, the right approach would be to split content into smaller records, by job opening, and repeat company data.

 

After#

With the strategy of splitting records per company, you would have a single record per job opening, and repeat the company in each. Here’s what it might look like:

 

[
  {
    "company": "Twilio",
    "job_opening": "Staff Software Engineer - Cloud Platform"
  },
  {
    "company": "Twilio",
    "job_opening": "Lead Front End Engineer"
  },
  {
    "company": "Twilio",
    "job_opening": "Senior Data Engineer"
  },
  {
    "company": "Twilio",
    "job_opening": "Senior Software Engineer, Developer Experience"
  },
  {
    "company": "Algolia",
    "job_opening": "Full-Stack Software Engineer"
  },
  {
    "company": "Algolia",
    "job_opening": "Frontend Engineer"
  },
  {
    "company": "Algolia",
    "job_opening": "Open Source Software Engineer (JavaScript)"
  },
  {
    "company": "Algolia",
    "job_opening": "Senior Software Engineer - Core API"
  },
  {
    "company": "Algolia",
    "job_opening": "Senior Systems Engineer - SRE"
  }
]

 

This approach has many benefits. First, job openings are no longer intertwined, which allows for more granular search. Whenever someone searches for a position, for example, “engineer”, they no longer retrieve records representing a company with the full job openings list. Instead, they get single, best matching job positions, that can be individually ranked with custom ranking attributes.

이 접근법은 많은 이점을 가지고 있습니다. 첫째, 구인공고가 더 이상 얽히지 않아 보다 세분화된 검색이 가능하다. 예를 들어, 누군가가 "엔지니어"와 같은 자리를 찾을 때마다, 그들은 더 이상 전체 구인 목록을 가진 회사를 대표하는 기록을 검색하지 않는다. 대신, 그들은 커스텀 순위 속성으로 개별적으로 순위를 매길 수 있는 가장 잘 맞는 단일 직위를 얻는다.

 

Besides, you can handle the duplicate data with Algolia’s distinct feature. Enabling this would let you, for example, only retrieve the best matching position per company.

또한 Algolia의 고유한 기능으로 중복 데이터를 처리할 수 있습니다. 예를 들어, 이 옵션을 선택하면 회사별로 가장 적합한 위치만 검색할 수 있습니다.

Configuring attributeForDistinct and Enabling distinct

Using the API#

To use distinct you first need to set company as attributeForDistinct during indexing time. Only then can you set distinct to true to de-duplicate your results. Note that setting distinct  at indexing time is optional. If you want to, you can set it at query time instead.

index.setSettings({
  attributeForDistinct: 'company',
  distinct: true
}).then(() => {
  // done
});

Once attributeForDistinct is set, you can enable distinct by setting it to true. Note that you can set distinct to true or 1 interchangeably. If you wanted to show the three best positions for one company, you could set distinct to 3.

 

 

index.search('query', {
  distinct: true
}).then(({ hits }) => {
  console.log(hits);
});

Using the dashboard#

You can also set your attribute for distinct and enable distinct in your Algolia dashboard.

  • Go to your dashboard and select your index.
  • Click the Configuration tab, then click on Deduplication and Grouping.
  • Set Distinct to true
  • Select attribute “company” in the Attribute for Distinct dropdown.
  • Don’t forget to save your changes.
 
 

 

 

 

 

 

 

 

728x90

'개발 > ALGOLIA' 카테고리의 다른 글

알고리아 Managing Results(3-37)  (0) 2022.04.27
알고리아 Managing Results(3-36)  (0) 2022.04.27
알고리아 Managing Results(3-33)  (0) 2022.04.20
알고리아 Managing Results(3-32)  (0) 2022.03.05
알고리아 Managing Results(3-31)  (0) 2022.03.05