2009-07-09 3 views
0

일반적으로 검색 할 때 검색 문자열을 제공하고 검색 문자열이 해당 검색 문자열과 일치하는 결과 목록을 기대합니다.파이썬에서 검색 문자열을 검색하는 방법

내가 원하는 것은 그 반대입니다. 검색 문자열 목록과 한 이야기를 제공하고 그 이야기와 일치하는 검색 문자열을 찾으십시오.

이제이 작업을 다시 수행 할 수 있지만 여기서는 solr이 지원하는 복잡한 검색 쿼리를 사용하려고합니다. query syntax here의 전체 세부 정보 참고 : 나는 부스트를 사용하지 않을 것이다.

기본적으로 아래 예제 코드에서 doesitmatch 함수에 대한 몇 가지 포인터를 얻고 싶습니다.

def doesitmatch(contents, searchstring): 
    """ 
    returns result of searching contents for searchstring (True or False) 
    """ 
    ??????? 
    ??????? 


story = "big chunk of story 200 to 1000 words long" 
searchstrings = ['sajal' , 'sajal AND "is a jerk"' , 'sajal kayan' , 'sajal AND (kayan OR bangkok OR Thailand OR (webmaster AND python))' , 'bangkok'] 

matches = [[searchstr] for searchstr in searchstrings if doesitmatch(story, searchstr) ] 

편집 :는 또한 또한 모든 모듈은 정규식에 아래와 같은 루씬 쿼리를 변환 할 수있는 경우를 알고 관심을 가질만한 :

sajal AND (kayan OR bangkok OR Thailand OR (webmaster AND python) OR "is a jerk") 

답변

0

은 아마 천천히,하지만 쉬운 해결책 :

만들기 스토리에 대한 쿼리와 각 문자열을 검색 엔진에 전달합니다. 아무것도 반환하지 않으면 일치합니다.

그렇지 않으면 사용자가 직접 검색 구문을 구현해야합니다. 여기에 "제목 :"과 같은 내용이 포함되어 있다면 물건이 다소 복잡 할 수 있습니다. 귀하의 예제에서 AND 및 OR 일 뿐이라면 너무 털이없는 재귀 함수입니다.

+0

내 검색 엔진 (solr)을 사용할 때의 문제점은 목록 검색 문자열 위에있는 코드가 10,000 개 이상의 구를 갖게된다는 것입니다. 스토리 당 검색 서버를 10,000 번 이상 사용하는 것은 이상적이지 않습니다. 매우 비쌉니다. 어떤 복잡한 것들을 사용하지 않고 임 : Im은 정규 표현식으로 변환하는 함수를 작성하려고하지만, 제한된 정규식 기술을 사용하면 그러한 함수가 이미 파이썬에 존재하는지 조사 할 생각입니다. ... – sajal

0

얼마 전 lucene의 파이썬 구현을 찾았으며 순수 파이썬 텍스트 기반 연구 엔진 인 Woosh을 발견했습니다. 어쩌면 그것은 당신의 필요를 증명할 것입니다.

pyLucene도 시도 할 수 있지만이 문제는 조사하지 않았습니다.

0

다음은 의사 코드의 제안 사항입니다. 인덱스에 검색어가 포함 된 스토리 식별자를 저장한다고 가정하므로 검색 결과를 검색 할 수 있습니다.

def search_strings_matching(story_id_to_match, search_strings): 
    result = set() 
    for s in search_strings: 
     result_story_ids = query_index(s) # query_index returns an id iterable 
     if story_id_to_match in result_story_ids: 
      result.add(s) 
    return result 
+0

문제는 내 인덱스가 다른 서버에서 실행 중이고 search_strings이 10,000 개 이상의 용어를 포함한다는 것입니다. 많은 쿼리를 실행하면 시간과 리소스 측면에서 비용이 많이 듭니다. – sajal

+0

검색 문자열은 얼마나 자주 변경됩니까? –

+0

하루에 여러 번 (아직 다가오는 프로젝트를 아직 완전히 결정하지는 않았지만 ...)> 1ce/hour – sajal

1

광범위한 검색 결과를 얻은 후 부울 검색이 가능하다는 것을 깨달았습니다. http://code.activestate.com/recipes/252526/

문제는 지금 해결 보인다 :

는 인식 정규식 부울을 만드는 코드를 발견.

0

당신이 이미 문제를 해결했기 때문에 지금은 덜 흥미로울 것입니다. 그러나 당신이 말하는 것은 Prospective Search처럼 들리는데, 이는 처음에 쿼리가 있고 그걸 검색하기를 원할 때 호출하는 것입니다 그들이 올 때 문서에 대비하여

Lucene의 MemoryIndex은 이와 같은 용도로 특별히 설계된 클래스로, 단일 문서에 대해 많은 쿼리를 실행하는 것이 효율적일 수 있습니다.

이것은 파이썬과는 아무런 관련이 없습니다. 아마도 자바에서 이런 식으로 작성하는 것이 더 나을 것입니다.

+0

흥미 롭다. 이미 솔로 (lucene 기반)를 사용하고 있는데, 이것을 사용하면 좋을지 모른다. id가 python에 있기를 선호하는 이유는 im이 장고 프로젝트 내에서 그것을 사용하기 때문입니다. 더욱이 나는 자바에서 hello world를 쓸 수도 없다. :) – sajal

+0

나는 이것이 이전의 질문/코멘트라는 것을 알고 있지만, 이것을 읽는 사람들은 ElasticSearch가 이것을 퍼콜 레이션 기능으로 제공한다는 사실에 관심이있을 수있다. – herman

관련 문제