2009-04-30 5 views
1

나는 간단한 PHP 기반의 사내 CMS를 유지 관리하고 있습니다. 나는 자동적으로 그 토큰들에 링크를 적용하고 또한 그 토큰들 사이의 관계 테이블에 관계를 수립하기 위해, 최종적으로 수만 개의 서로 다른 토큰들이 시스템에 저장 될 때 기사의 텍스트를 검색하고 싶다. article과 token이 나타내는 엔티티.(잠재적으로) 수만개의 토큰에 대한 텍스트 검색

가장 좋은 방법은 무엇입니까? 기사를 저장할 때마다 모든 토큰과 관련 엔티티/ID의 목록을 검색하는 것보다 더 빠르고 더 효율적인 방법이 있습니까?

검색 할 토큰 목록을 설정하는 가장 좋은 방법보다 토큰을 교체하는 데 덜 관심이 있습니다. 여러 테이블에서 나올 것이고, 요청 당 기준으로 데이터 세트 쿼리 할 필요가 스크립트의 DB 및 메모리로드 모두 부담이 될 것입니다

편집 : 내가 잘못 질문을 제기했다고 생각합니다. 존슨 Fatlumps은 서른 두 먹었다 동안

스티브 맥 머핀은, 냄새 나는 콩에서 열일곱 개 멋진 모피 파 히타 먹었다 :

다음과 같은 텍스트를 생각해 보자.

'person'테이블, 'restaurant'테이블에있는 하나의 레스토랑 및 'restaurant_menu_item'테이블에있는 하나의 레스토랑 메뉴 항목에있는 두 사람이 있습니다.

그 텍스트를 저장 한 후 자동으로 사용자가 무엇인지, 레스토랑이 무엇인지, 식당 메뉴 항목이 인지 확인하고 사용자 정의 마크 업을 사용하지 않고 가장 좋은 방법을 알고 싶습니다. 의도 된 청중은 사실상 그 권리를 얻을 기회가 거의 없습니다.

+1

흥미로운 질문 같은 것을 처리 할 수 ​​있습니다.한 가지 고려해야 할 사항 : 충돌이 있다면 무엇입니까? 즉, "Steve McMuffin"이 사람이고 "McMuffin"이 "레스토랑 메뉴 항목"이라면 무엇입니까? 어떻게 처리하고 싶습니까? –

+0

좋은 지적. 나는 전혀 모른다! 있니? – Shabbyrobe

답변

1

토큰 형식에 대한 보증을받지 못하면 항상 어려워집니다 (계산적으로, 어쨌든). 마크 업이 없다면, 컴퓨터는 형식을 인식하도록 가르 칠 수없는 경우 특수 문자 열이 특별한 의미가 있다는 것을 실제로 알지 못합니다.

"간단한"대답은 각 토큰의 텍스트를 반복하여 거기에 있는지 확인하고 처리하는 것입니다. 하지만 계산 시간과 충돌이라는 두 가지 문제가 있습니다 (Chad는 그의 의견에서 지적했습니다).

적용 할 수있는 매우 간단한 마크 업이 있습니까? MediaWiki는 문구가 [[괄호]]로 둘러싸인 경우에만 내부 링크를 생성합니다. 많은 위키 소프트웨어는 CamelCaseThePhrase 만 연결하면됩니다.

정의 된 모든 토큰을 검사하거나 일종의 형식을 적용하지 않고도 특정 문자 그룹이 의미를 갖는지 자동으로 인식하는 방법을 생각할 수 없습니다.

는 반드시 청중이

SteveMcMuffin ate seventeen FabulousFurryFajitas at 
TheStinkingBean, while JohnsonFatlumps ate thirty-two. 

또는

[[Steve McMuffin]] ate seventeen [[Fabulous Furry Fajitas]] at 
[[The Stinking Bean]], while [[Johnson Fatlumps]] ate thirty-two. 
+0

불행히도 거의 확실합니다. 그들이 그런 것들을 처리 할 수 ​​있다면, 나는 할 일이별로 없을 것입니다. :) – Shabbyrobe

0

비슷한 상황이있었습니다. 우리는 토큰의 구문 분석과 대체를 위해 정규 표현식을 사용하는 것으로 끝 맺었습니다. 원래 기사는 토큰이 교체 된 새 기사를 생성하는 템플릿 이었으므로 생성 된 태그를 캐시하여 템플릿에 대한 변경 사항이 없으므로 새로운 구문 분석이 필요 없습니다.

관련 문제