기능 스포트라이트: 선택적 필터

7714 단어 searchjavascript
지난 주에 Algolia 포럼 게시물에 답변하면서 Algolia 검색에 대해 Optional Filters에 대해 심층 분석했습니다. 필터 및 패싯 필터와 유사하게 선택적 필터는 쿼리 시 적용되므로 모든 종류의 컨텍스트 정보를 사용하여 결과를 개선할 수 있습니다. 다른 필터와 달리 선택적 필터는 결과 집합에서 레코드를 제거하지 않습니다. 대신 반환된 레코드 수를 변경하지 않고 "레코드가 이 필터와 일치하면 순위를 위 또는 아래로 이동"이라고 말할 수 있습니다.

몇 가지 흥미로운 사용 사례:
  • 특정 사용자를 언급하는 게시물을 결과 집합의 맨 위로 이동
  • 고객의 지역 상점에서 사용할 수 있는 고급 제품
  • 품절된 하위 상품
  • 외부 추천 엔진을 기반으로 특정 레코드를 목록 상단에 고정

  • 필터 및 패싯 필터를 사용하여 쿼리 시 결과 집합의 레코드 수를 줄인 다음 선택적 필터를 사용하여 나머지 레코드의 순위를 조작할 수 있습니다. 레코드 순서를 추가로 제어하기 위해 적용filter scoring할 수도 있습니다.

    다음은 product_typeprice_range에 대한 패싯 필터를 Shopify 스토어의 인덱스에 적용하는 예입니다. 이 코드는 승격할 두 레코드objectID를 선택한 다음 선택적 필터로 쿼리에 삽입합니다. 이러한 제품 중 하나가 쿼리의 다른 기준과 일치하는 결과 집합의 일부인 경우 해당 제품이 순위 맨 위로 푸시됩니다. 이 코드는 필터 점수를 사용하여 featuredProduct가 항상 alternateProduct 위에 표시되도록 합니다.

    import algoliasearch from 'algoliasearch';
    
    const featuredProduct = '41469303161004';
    const alternateProduct = '41469346644140';
    
    const client = algoliasearch('H2M6B61JEG', 'b1bdfc3258823bb4468815a664dce649');
    
    // Standard replica
    const index = client.initIndex('shopify_algolia_products_price_asc_standard');
    
    // with params
    index.search(query, {
        facetFilters: [[
            "product_type:HardGood",
            "price_range:75:100"
        ]],
        optionalFilters: [[
            `objectID:${featuredProduct}<score=500>`,
            `objectID:${alternateProduct}<score=200>`
        ]],
        hitsPerPage: 50,
    }).then(({ hits }) => {
        console.log(hits.map(item => `- ${item.title} | ${item.product_type} | ${item.objectID} | ${item.price_range}`).join('\n'));
    });
    


    이 코드는 가격별로 정렬된 Shopify 인덱스의 표준 복제본을 사용합니다. 선택적 필터는 Virtual Replica 인덱스와 잘 작동하지 않습니다. 둘 다 쿼리 시간에 레코드의 순위를 재지정하여 예측할 수 없는 결과를 초래하기 때문입니다. 선택적 필터를 사용하려는 경우 인덱스 시간에 순위를 적용하는 표준 복제본을 사용해야 합니다.

    또한 부정적인 선택적 필터를 사용하여 레코드를 순위 아래로 푸시할 수 있습니다. 예를 들어, 현재 사용자가 작성한 게시물을 순위에서 더 낮게 푸시하지만 완전히 제거하지는 않으려는 경우:

    index.search('', {
        filters: `date_timestamp > ${Math.floor(d.setDate(d.getDate() - 7) / 1000)}`,
        optionalFilters: [
          `author:-${user.name}`
        ],
        hitsPerPage: 50,
    }).then(({ hits }) => {
        console.log(hits};
    });
    


    선택적 필터는 순위 도구 벨트에 추가할 수 있는 강력한 도구이지만 모든 쿼리 시간 계산은 검색 성능에 영향을 미친다는 점을 기억하십시오. 예를 들어 100,000개 이상의 결과를 반환할 수 있는 검색에 필터 점수를 사용하면 안 됩니다. 가능하면 항상 순위 기준을 인덱스 구성으로 옮기십시오. 더 많은 실시간 컨텍스트를 사용하여 쿼리 시간에 결과를 추가로 조정해야 하는 경우에만 선택적 필터를 사용하십시오.

    검색 UI에서 선택적 필터에 대한 훌륭한(또는 그다지 좋지 않은) 사용 사례를 찾으면 알려주세요!

    좋은 웹페이지 즐겨찾기