2012-04-19 1 views
0

MySQL 5.5.22의 여러 테이블에서 전체 텍스트 쿼리를 실행하고 있습니다. 이 응용 프로그램은 innodb 테이블을 사용하므로 전체 텍스트 검색을위한 MyISAM 테이블을 만들었습니다. 이 테이블은 단독으로 전체 텍스트 검색, 그들이 정규화되어 있습니다으로많은 테이블에서 MySQL의 전체 텍스트 검색으로 가장 관련성 높은 결과 수집

예를 들어, 내 테이블 중 일부는

account_search 
=========== 
id 
account_id 
name 
description 
hobbies 
interests 

product_search 
=========== 
id 
product_id 
name 
type 
description 
reviews 

처럼 보인다. 데이터는 여러 테이블에서 올 수 있으며 검색 테이블에 집계됩니다. ID 열 외에 나머지 열은 1 전체 텍스트 인덱스에 할당됩니다.

전체 텍스트 검색에서 "50 %"규칙을 해결하려면 IN BOOLEAN MODE을 사용하고 있습니다.

따라서 위, 나는 실행됩니다 : P

내가 직면하고 문제를 다음과 같습니다 :

    SELECT *, MATCH(name, type, description, reviews) AGAINST('john') as relevance 
    FROM product_search 
    WHERE MATCH(name, type, description, reviews) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10 
    
    SELECT *, MATCH(name, description, hobbies, interests) AGAINST('john') as relevance 
    FROM account_search 
    WHERE MATCH(name, description, hobbies, interests) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10 
    

    는 그냥 우리가뿐만 아니라 "존"이라는 제품이 있다고 가정하자

  • 의미있는 관련성을 얻으려면 IN BOOLEAN MODE없이 검색해야합니다. 즉, 검색에 50 % 규칙 및 단어 길이 규칙이 적용됩니다. 따라서 매우 자주 product_search 테이블에있는 제품의 대부분이 john이라면 해당 관련성은 0으로 반환됩니다.

  • 여러 쿼리 간의 관련성은 비교할 수 없습니다. (한 쿼리의 14의 관련성이 다른 쿼리의 14의 관련성과 같지 않음)

  • 검색 그냥이 두 테이블에 국한되지 않습니다

  • 는, 예를 들어 다른 "개체 유형"이 있습니다 : "주문", "거래"등

내가 수 있도록하고 싶습니다 키워드 세트 (1 개의 검색 상자는 모든 오브젝트에 대한 결과를 리턴 함)를 가진 ALL 오브젝트 유형의 가장 관련성이 높은 결과 7 개를 리턴합니다.

위에서 알 수 있듯이, 상위 7 개를 얻으려는 알고리즘이나 아이디어는 무엇일까요?

나는 solr 및 elasticsearch와 같은 것을 사용할 수 있음을 알고 있으며, 이미 응용 프로그램에 통합하는 과정에서 이미 시도했지만 MySQL에 대한 액세스 권한 만 가진 사용자를 검색 할 수 있기를 바랍니다. .

답변

0

그래서 잠시 생각한 후에 MySQL 내에서 1 개의 쿼리로 관련성 순위를 결정해야한다고 결정했습니다. 별도의 쿼리 사이

  • 관련성 비교 할 수 없습니다 때문에

    이다.

  • 의미있는 방법으로 여러 검색의 콘텐츠를 결합하는 것은 어렵습니다.

검색 전용 인덱스 테이블을 사용하도록 전환했습니다. 엔트리는 삽입, 제거 및 innodb 테이블의 실제 기본 데이터에 대한 업데이트 (이것은 모두 자동입니다)에 따라 삽입, 제거 및 업데이트됩니다.

표는 다음과 같습니다

search 
============== 
id //id for the entry 
type //the table the data came from 
column //column the data came from 
type_id //id of the row the in the original table 
content //text 

컨텐츠 열에서 전체 텍스트 인덱스있다. 모든 테이블의 모든 열이 인덱싱되는 것은 아니며, 검색에 유용하다고 판단되는 항목 만 추가된다는 사실을 깨닫는 것이 중요합니다.

따라서 쿼리를 실행하여 content에 일치시키고, 보유하고있는 정보를 검색하고 추가 처리를 수행하는 간단한 경우입니다. 최종 결과를 처리하기 위해 부모 테이블에 검색 결과 제목 및 기타 메타 데이터를 요청하는 데 몇 가지 쿼리가 필요할 수 있지만 이는 실행 가능한 솔루션입니다.

이 방법이 실제로 확장 될 것이라고는 생각하지 않지만 (업데이트와 삽입은이 테이블도 업데이트해야합니다), 응용 프로그램의 소규모 배포에 알맞은 응용 프로그램 검색을 제공하는 것이 좋습니다.

확장 성을 위해 탄성 검색, solr 또는 lucene과 같은 것을 사용하십시오.

관련 문제