2010-03-10 3 views
4

프로젝트에 대해 "ALPHABETICAL ORDER SEARCH"모듈을 수행 중입니다. 이PHP와 MYSQL을 사용하여 검색에서 "THE"를 생략하는 방법

A B C D E F 같을 것이다

. . . . . . . . . ... . . . . . ... . .

내가 ""결과를 클릭 Z는 ""을 기준으로 정렬해야합니다. 모든 알파벳에 대해 동일합니다. 다음과 같이

이제 내 확률값은 다음과 같습니다

  • 예를 들어 "미라"라는 영화가있다.

  • "ALPHABET T"을 클릭하면 해당 영화가 정렬됩니다.

  • 하지만 내 클라이언트 요구 사항은 사용자가 "M"이 아니라 "T"를 클릭 할 때

  • 때문에 "미라"영화 "는, AN,은"는 "있는 일종의해야한다는 것입니다 기사 "와 같은 의미가 없습니다.

나는

어떤 도움 감지하고 감사 할 것입니다 .... 모두가 내 문제가 무엇인지 이해할 수 해주기를 바랍니다. 당신이 테이블의 내용을 수정하지 않으 가정하면 미리

답변

2

에서

덕분에 트릭을해야 다음, (따라서 약간 덜 효율적인 쿼리를 얻을).

SELECT Title 
FROM myTable 
WHERE (Title LIKE 'x%' OR Title LIKE 'THE x%') 
    -- AND Title NOT LIKE 'THE [^T]%' 
ORDER BY Title 

노트 (당신은,이 답변의 끝에 제안을 테이블을 수정하는 레저를 볼 수있다을 경우) :
- X 지정 원하는 문자 (예 : LIKE 'A % '등)
- 여분의 조건 만 "X"는 문자 "T"인 경우에 필요하다 "제목이 마음에 들지는"(이 기능적으로, 그렇지 않으면 중복
이지만)
을 결과를 변경하지 않습니다 - I [^xyz] (예 : )의 지원을 확신 할 수 없습니다. T 문자 x, y 또는 z)이므로 [^T]은 긍정적 인 의미 인 [A-RS-Z0-9]으로 바꿀 수 있습니다.

고려해야 할 다른 중지 단어가 있지만 ("A", "AN", "OF"...) 책이나 영화 제목의 경우 "THE"만 고려하는 것이 일반적입니다.당신은 다른 기사를 처리해야하는 경우, 논리는 같이 확장 할 수 있습니다 :

SELECT Title 
FROM myTable 
WHERE (Title LIKE 'x%' 
    OR Title LIKE 'THE x%' 
    OR Title LIKE 'A x%' 
    OR Title LIKE 'AN x%') 
-- the following is only needed when "x" is either the letter T or A. 
-- AND (Title NOT LIKE 'THE [^T]%' 
--  AND Title NOT LIKE 'A [^A]%' 
--  AND Title NOT LIKE 'AN [^A]%' 
-- ) 
ORDER BY Title 



더 나은 솔루션이 있습니다, 당신이 테이블의 내용을 수정할 수 있습니다합니다. 이들 중 일부는 하나 또는 여러 개의 추가 열을 사전 계산하는 것을 의미합니다 (새 레코드가 추가 될 때 등).

  • 여분의 열이 바람직하지 않은 최고의 노이즈 단어 박탈 제목을 포함하는 "열 _ 정렬"접근,이 게시물에 예 클리 터스 '대답을 참조하십시오. OP의 초기 문자 검색 문제에서 필터링 필드와 같은 목적 외에도이 열을 사용하여 더 친숙하고 합리적인 방법으로 초기 문자와 관련이없는 필터로 생성 된 제목 목록을 정렬 할 수 있습니다 및/또는 제목의 시작 (연도 별 검색).
  • 위의 변형은 "효과적인"초기 문자 (원하지 않는 잡음을 지나치는 문자) 만 저장하는 것이므로 더 작은 열을 만들지 만 덜 범용적인 문자는 만들지 않습니다.
  • 제목 열 자체를 업데이트하여 제목의 수정 된 형식을 저장할 수 있습니다. 이로 인해 관계없는 선행 노이즈 단어가 괄호 사이의 문자열 끝에 이동됩니다. 이 관행은 서지 형식 카탈로그에서 매우 일반적입니다.
+0

안녕하세요. 많은 노력에 감사드립니다. 그리고 난 "좋아해"에 대한 결과를 얻었습니다. "좋아하지 않습니다"에 대한 결과를 얻지 못했습니다 ... 수행 할 변경 ... *에서 영화 선택 where film_status = 'Active' AND (user_id = '3'또는 distributor = '3') AND ('T %'또는 'T %'또는 'T %'또는 '%'와 같은 영화 이름 또는 'T %'또는 film_name LIKE '와 같은 영화 이름 T % '또는'T % '와 같은 영화 이름) AND AND (영화 이름은 [^ T] %'와 같지 않고 영화 이름은 '[^ T] %'AND 영화 이름과 같지 않음 '[^ T] %'AND AND '[^ T] %'와 (과) 같은 영화 이름이 아님) 주문 필름 이름 – Fero

+0

이 위의 질문입니까? – Fero

+0

@Fero : 예, 댓글의 검색어가 맞습니다. 대/소문자를 구분하지 않고 mySQL이 텍스트를 처리하도록하는 방법이 있습니다. 이렇게하면 "The"등으로 이러한 모든 여분의 조건을 해결할 수 있습니다. – mjv

2

"정지 단어"("the"는 "예"일 뿐이며 "of", "a"등)는 제거하는 것이 좋습니다. 정지 단어 세트를 하드 코드하려고하면 엉덩이에 큰 고통이되며, 코퍼스가 변경되면 코드를 변경해야합니다.

대신 귀하의 코퍼스를 기반으로 정지 단어가 무엇인지 추론 할 알고리즘을 사용해야합니다. 이런 종류의 일을하는 알고리즘은 잘 알려져 있으며 검색 엔진에서 사용됩니다. 매우 잘 작동하는 것은 TF/IDF

+1

+1이 문제를 (그리고 유익한/구글 푸를 가지고 열쇠) 문구 '중지 단어'를 언급에 대한 –

+0

+1 내 질문에 대한 답변은 "독일어/프랑스어/등 기사에 대해? " –

2

기본적으로 어떻게 정렬합니까? name 열이있는 movie 테이블이 있으면 sort_name이라는 열을 추가하십시오. 영화 제목을 소문자로 묶어 앞에서 무시할 단어 (예 : "the", "a")를 포함해야합니다.

동적으로 시도하지 마십시오.

필드가 업데이트되면 sort_name 열을 업데이트해야합니다. 언제든지 다시 작성할 수 있으며 물론 색인을 생성해야합니다. 그렇다면 다음을 수행하십시오.

SELECT * 
FROM movies 
WHERE sort_name LIKE 'a%' 
관련 문제