내가

2009-07-17 4 views
1

내가 임의의 URL을 감안할 때 DB를내가

url      data 
^(.*)google.com/search foobar 
^(.*)google.com/alerts barfoo 
^(.*)blah.com/foo/(.*) foofoo 
... 100's more 

에 URL을 다음과 같은 설정을 말해봐 들어오는 URL에 대해 일치 될 수있는 URL의 정규 표현식에 (파이썬)의 집합을 포함하는 DB를 설계 얼마나 야생, 나는 그 URL이 기존의 URL 집합에 속하는지 확인하고 을 확인하고 해당 데이터 필드를 얻으십시오.

내 질문은 :

  1. 내가 DB를 설계 할 어떻게 할
  2. 장고 않는 각 정규식 통해 반복 어쩌면 URL을 1000 년대는 이것을이 주어진 일치 를 확인하여 urlresolution 이것을 접근하는 가장 좋은 방법은?
  3. 내가 볼 수있는 기존 구현이 있습니까?
+1

나는 그들을 사용한 적이 없지만 이것은 블룸 필터의 잠재적 인 사용처럼 보입니다. 정규식을 사용할 수 없지만 현재 url 구문이 매우 큰 집합과 일치하는 경우 빠른 검사를 받게됩니다. http://en.wikipedia.org/wiki/Bloom_filter 은 파이썬에서 구현되었습니다. http://www.coolsnap.net/kevin/?p=13 – Paul

+0

두 개 이상의 정규식이 URL과 일치하면 어떻게됩니까? 그것은 가능합니다. –

+0

+1 블룸 필터 참조. –

답변

0

내가 기울이는 계획은 도메인 이름 + tld를 URL에서 선택하여 URL에서 키로 사용한다. 모든 정규식과 루프를 통해 을 통해이 정규식 하위 세트를 찾아 일치 항목을 찾습니다.

나는 들어오는 URL이 URL을 많은 DB에 일치시킬 수 있어야 읽고 도메인 특정 URL의 부분 집합 통해 반복 2dB의 비용을, 그래서이

class Urlregex(db.Model): 
    """ 
    the data field is structured as a newline separated record list 
    and each record is a space separated list of regex's and 
    dispatch key. Example of one such record 

    domain_tld: google.com 
    data: 
     ^(.*)google.com/search(.*) google-search 

    """ 
    domain_tld = db.StringProperty() 
    data = db.TextProperty() 

class Urldispatch(db.Model): 
    urlkey = db.StringProperty() 
    data = db.TextProperty() 

두 개의 테이블을 사용 .

0

장고는 URL이 일반적으로 계층 적이라는 장점이 있습니다. 장고 프로젝트 전체에는 100 개 이상의 URL이있을 수 있지만 한 번에 12 개 이하의 패턴 만 처리 할 수 ​​있습니다. 이 방법으로 악용 할 수있는 URL 구조가 있습니까?

이외의 다른 방법을 사용하여 시도해 볼 수 있습니다. 예 : 패턴의 "고정 된"부분을 찾은 다음 그 중 일부를 제거한 다음 (간단한 부분 문자열 검색을 통해) 정규식 일치로 전환합니다.

스펙트럼의 끝 부분에서 제품 자동화를 만들 수 있습니다. 그것은 매우 빠르지 만 메모리 요구 사항은 아마도 비실용적 일 것입니다 (그리고 앞으로 몇 세기 동안 그렇게 남아있을 가능성이 있습니다).

0

django 접근 방식이 제대로 작동하지 않는다고 판단하기 전에 장고 접근 방식을 구현하고 일반적인 작업 부하를 적용 해보십시오. 정말 thourough 접근 방식을 위해, 당신은 실제로 각 정규 표현식의 비용을 시간 수 있고 가장 비용이 많이 들고 가장 자주 사용되는 정규 표현식을 향상시키는 데 도움을 줄 수 있습니다. 특히 가장 자주 사용되는 저렴한 정규 표현식을 목록 앞쪽에 배치 할 수 있습니다. 이것은 아마도 당신이 아직 모르는 문제를 해결하기위한 새로운 기술을 발명하는 것보다 나은 선택 일 것입니다.

+0

+1 나는 한 번 이상 upvote 수 있었으면 좋겠어! –

+0

-1 위는 비명을 지르는 자들을 설득하는 비 답이다. 나는 장고 접근법이 효과가 없다고 결정하지도 않았고 분명히 내가 모르는 문제에 대해 새로운 것을 발명하지도 않았다. db에 많은 수의 URL이 주어지면 임의의 URL이 주어지면 정규식 일치를 식별 할 수있는 방법을 어떻게 설계 할 수 있습니까? 나는 어느 하나에 정착하기 전에 가능한 여러 가지 방법을 모색하고있다. – molicule

+1

@molicule : 음, 바로 그걸 구현하는 방법이있었습니다. 특히, 나는 가능한 일을 할 수있는 가장 단순한 것으로부터 시작할 것인데,이 경우에는 정규 표현식이 내가 원하는 것을 수행하기로 결정했기 때문에 모든 것을 일종의리스트에 넣을 것이다. 일치 할 때까지 확인하십시오. 다른 고려 사항과 함께 시작하는 유일한 이유는 다른 솔루션이 정규식 목록보다 더 단순하다고 생각하기 때문입니다. – SingleNegationElimination

0

정규식 디자인에 더 많은주의가 필요합니다. 예를 들어 접두어 ^(.*)은 모든 입력과 일치합니다. 여러 이유로 그룹을 캡처하려면 접두어가 필요할 수도 있지만 데이터베이스에 URL을 쉽게 제거 할 수는 없습니다.

정규식의 다루기 힘든 부분에 대한 TokenMacGuy의 의견에 일종의 일종이지만 실제 문제의 규모에 따라 상황이 완전히 희망이 없을 수도 있습니다. 예를 들어 일치시킬 URL의 경우 첫 번째 문자가 일치해야합니다. 예를 들어 입력의 첫 번째 문자가 해당 URL과 일치하는지 말함으로써 URL을 사전 필터링 할 수 있습니다. 따라서 보조 문자 표 MatchingFirstCharacters이 있습니다.이 표는 초기 문자와 해당 초기 문자와 일치하는 URL 사이의 조회입니다. (이것은 내 대답의 첫 번째 단락에서 언급했듯이 모호한 접두어가 많지 않은 경우에만 작동합니다.)이 접근법을 사용하면 정규식을 모두로드 할 필요가 없다는 것을 의미합니다. 적어도 첫 번째 문자가 일치하는 문자.나는 아이디어가 더 일반화 될 수 있다고 생각하지만 그것은 독자를위한 운동이다 ;-)

+0

하위 그룹, 모듈, 날짜, 슬러그 등을 선택하기 위해 명명 된 그룹을 가질 것으로 기대됩니다. 표시된 정규 표현식은 대표적이었습니다. TokenMacGuy의 정규식에 대한 해답은 해결책이 아닙니다. 정규 표현식은 그 자체 다. MatchingFirstCharacters 접근법은 도메인 + tld를 고유 키로 사용하는 곳으로 기울고있는 가능한 해결책과 동일한 경로에 있습니다. 아래 답변을 참조하십시오. – molicule

1

"2. 장고는 각 정규식 통해 반복 어쩌면 URL을 1000 년대는이 접근하는 가장 좋은 방법은 주어진 일치를 확인하여 urlresolution합니까?"

"내가 볼 수있는 기존 구현이 있습니까?" 정규 표현식의 큰 숫자를 실행하면 문제가 판명 않는 경우

, 당신은 정규 표현식의 큰 컬렉션을 가속화하기위한 파이썬 확장 모듈은 esmre를 확인해야한다. 각 정규 표현식의 고정 된 문자열을 추출하여 Aho-Corasick-inspired pattern matcher에 넣으면 거의 모든 작업을 신속하게 제거 할 수 있습니다.