250k 미만의 잠재적 인 레코드를 처리하기위한 경량 문서 색인


10

최근에 나는 문서 인덱싱 엔진의 한계에 도전하고 있습니다. 상당히 강력한 검색 기능이 필요한 작은 웹 사이트를 개발하고 있었지만 하드웨어 제약으로 인해 이러한 요구를 처리하기 위해 Lucene-ish 솔루션 (일반적으로 Solr 또는 ElasticSearch 등)을 배포 할 수 없었습니다.

심지어 데이터베이스 집약적 인 복잡한 데이터와 계산을 처리해야했지만 250k 개 이상의 잠재적 레코드를 처리 할 필요가 없었습니다. 이를 처리하기 위해 전체 Solr 또는 ES 인스턴스를 배포하는 것은 낭비처럼 보였습니다.

그것에 대해 생각한 후에는 상당히 큰 문제처럼 보입니다. 대부분의 사람들은 SQL만으로 검색 요구 사항을 처리합니다. 데이터에 대한 SQL 쿼리를 실행하기 만하면됩니다. 그들의 검색 기능도 끔찍합니다.

  • 일부 시스템 (특히 공유 호스트)에서 포괄적 인 전체 텍스트 와일드 카드 검색을 수행하면 속도가 느려질 수 있으며 특히 쿼리가 복잡하고 조인이 많은 경우 데이터베이스가 다운 될 수 있습니다.

  • 사용자의 단일 요청으로 여러 쿼리를 수행하게됩니다. 훨씬 복잡한 쿼리로이 문제를 해결할 수 있지만 이전 사항을 참조하십시오.

  • 일반적으로 전체 텍스트 엔진에는 기능이 없습니다.

데이터베이스는 서버로 배포해야하는 것과 같은 문제를 겪고 나서 SQLite가 나타 났으며 갑자기 단일 파일에 자체 포함 된 데이터베이스를 배포 할 수있었습니다. 내 인터넷 검색에서 아무 것도 생성하지 못했습니다. 전체 텍스트 색인 생성 / 검색에 이와 같은 것이 있는지 궁금합니다.

간단한 문서 인덱싱을 구현할 것인지 (예 : 다른 질문 에 대한 답변에서 설명한대로 ) 이러한 상황에서 SQL을 계속 사용 할지 여부를 결정할 때 고려해야 할 요소는 무엇입니까 ?


5
여기서 시장 조사를 수행하지 마십시오. 여기서 문제는 주제가 아닙니다. FAQ를 먼저 읽어야하지만 onstartups 에서 묻는 것이 더 좋습니다 .
— Oded

9
우와-나는 회사를 시작하거나 여기에 아무것도를 찾고 있지 않습니다. 이것은 현재 상자 외부의 상황이나 다른 솔루션에서 사용할 기술을 찾는 정직한 질문입니다.
— Jarrod Nettles

16
소프트웨어 개발의 개념적 문제에 대한 사이트입니다. 소프트웨어 개발에있어 개념적 문제에 대해서는 묻지 마십시오.
— psr

3
거기에 좋은 질문이 있습니다 ... 더 명확하고 구체적으로 정리해야합니다.
— GrandmasterB

3
SQLite에 대한 유일한 불만이 텍스트 인덱싱 부족 인 경우 SQLite의 FTS4 확장 모듈을 사용하는 것이 어떻습니까?
— Brian

답변:


2

아시다시피, redis 사용을 고려해보십시오.

  • 문맥 아이디어를 사용하십시오 . 문서에 대해 더 많이 알지 못하면 깊이를 가지기가 어려울 것입니다. 종종 문서 제목에서 많은 것을 분별할 수 있습니다. 웹 크롤링과 마찬가지로 각 문서를 프로파일 링하는 것이 기본 첫 단계입니다.

  • 키워드 사전에서 각 단어 문서를 세어보세요. 전체 프로젝트에 대한 각 단어의 인기도를 추적하십시오. 문서 나 세트에서 높은 관련성을 감지 할 수있는 경우이 횟수에 대해 반복기에 가중치를 더하십시오.

    이것이 가장 먼저하는 일은 전체 세트에 포함 된 단어의 전체 목록을 제공하는 것입니다. 해당 목록에없는 것이 있으면 '결과 없음'이 자동으로 반환됩니다. 나는 인기도의 5-20 % (인덱스에 대한 검색 쿼리를 실행할 때)보다 낮은 순위의 결과 순위도 단순히 결과를 말하지 않는 것이 좋습니다. '

  • 당신이 경우 않는 레디 스 같은과 함께 할 것입니다, 또는 당신이 기술자 파일이나 미니 DB 파일 및 메모리 등 각각의 특정 문서의 뒷면을 설명하는 페이지 오브젝트 문서를 페어링 할 수 있습니다 자신의 메모리 구조를 확인하십시오. 슬롯에 대해 경쟁하거나 검색 할 때마다 성장할 시간을 제공함으로써 공통 검색을 메모리에 유지하십시오.

  • 더 나아가려면 링크 / 레퍼런스 / 포인터 / 인덱스 / 두 개 이상의 문서와 키워드 또는 문구 풀을 그룹화하는 참조 데이터를 저장하십시오. 기본적으로 펌핑 된 태그 클라우드를 얻습니다.

  • 또한, 사전에있는 단어가 유사한 메타 데이터 / 제목의 문서에서 일반적으로 정확한 문자열이 뒤 따르거나 앞에 오는 경우를 추적하여 구를 감지합니다. 이것은 집중적이지만 데이터를 렌더링하는 데 단 하나의 패스 만 필요합니다.

  • 데이터를 분리하고 그룹을 실제 사용에서 서로 관련시킬 수있는 방법이 많을수록 좋습니다.

  • 사용자가 상위 3 개가 아닌 결과를 클릭 할 때마다 추적하여 정확성 가능성을 연결하십시오. 완벽한 결과를 얻지 못한 사용자 검색을보고 구문 감지 기능을 향상시킵니다. 고객의 검색어를 기준으로 검색어를 작성하십시오.

  • 문서 업데이트를 감시해야합니까? Chronjobs / shell 스크립트 또는 예약 된 작업 / 배치 스크립트가 도움이 될 수 있습니다. 일정과 스크립팅을위한 다양한 옵션이 있습니다.

  • 디스크를 낭비하고 속도를 높이며 복잡성을 잃습니다. 문서의 여러 트리 및 / 또는 문서에 대한 링크 트리를 저장하십시오. 기준이 충족 된 트리 만 검색하거나 최소한 대부분의 경우 더 빠른 결과를 얻기 위해 트리를 선호합니다.

  • 간단한 순열 엔진을 만들거나 빠른 문자 감지를 사용하고 정규 표현식을 사용하지 않는 엔진을 찾으십시오. 또는 몇 시간 만에 정규 표현식을 사용하여 하나만 만들면 충분한 검색을 위해 성능 차이가 눈에.니다.

  • 너무 많은 것들.

이는 강력한 문서 색인 작성 및 검색을 구현하기위한 가능한 솔루션입니다. 모두를 포함하는 것은 아닙니다. 그리고 아마도 여분의 상자를 잡고 신경망을 던지고 신경망에 멋진 웹 인터페이스를 만드는 데 며칠을 보내는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.