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.