Как сопоставить строки поиска с содержимым в Python - PullRequest
0 голосов
/ 09 июля 2009

Обычно, когда мы ищем, у нас есть список историй, мы предоставляем строку поиска и ожидаем список результатов, где заданные строки поиска соответствуют истории.

То, что я хочу сделать, это наоборот. Дайте список строк поиска и одну историю и выясните, какие строки поиска соответствуют этой истории.

Теперь это можно сделать с помощью re, но в данном случае я хочу использовать сложные поисковые запросы, поддерживаемые solr. Полная информация о синтаксисе запроса здесь . Примечание: я не буду использовать повышение.

В основном я хочу получить несколько указателей на функцию doitmatch в приведенном ниже примере кода.

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) ]

Редактировать: Кроме того, было бы также интересно узнать, существует ли какой-либо модуль для преобразования запроса на lucene, как показано ниже, в регулярное выражение:

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

Ответы [ 6 ]

1 голос
/ 09 июля 2009

После продолжительного поиска в Google, я понял, что я хочу сделать это булев поиск.

Найден код, который делает логическое выражение регулярным выражением: http://code.activestate.com/recipes/252526/

На данный момент проблема выглядит решенной.

0 голосов
/ 22 августа 2011

Если вы пишете Python на AppEngine, вы можете использовать службу перспективного поиска AppEngine, чтобы добиться именно того, что вы пытаетесь сделать здесь. Смотри: http://code.google.com/appengine/docs/python/prospectivesearch/overview.html

0 голосов
/ 10 июля 2009

Это, вероятно, менее интересно для вас сейчас, так как вы уже решили свою проблему, но то, что вы описываете, звучит как Проспективный поиск , который вы называете, когда у вас сначала запрос и вы хотите сопоставить его с документами по мере их поступления.

Lucene's MemoryIndex - это класс, разработанный специально для чего-то подобного, и в вашем случае он может быть достаточно эффективным для выполнения множества запросов к одному документу.

Это не имеет ничего общего с Python. Возможно, вам лучше написать что-нибудь подобное в Java.

0 голосов
/ 09 июля 2009

Вот предложение в псевдокоде. Я предполагаю, что вы сохраняете идентификатор истории с поисковыми терминами в индексе, чтобы вы могли получить его с результатами поиска.

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 голосов
/ 09 июля 2009

Некоторое время назад я искал реализацию lucene на python и наткнулся на Woosh , который представляет собой чисто исследовательский движок на основе Python. Может быть, это будет соответствовать вашим потребностям.

Вы также можете попробовать pyLucene , но я этого не исследовал.

0 голосов
/ 09 июля 2009

Возможно, медленное, но простое решение:

Сделайте запрос к истории плюс каждую строку в поисковой системе. Если он что-то возвращает, то он совпадает.

В противном случае вам нужно самостоятельно реализовать синтаксис поиска. Если это включает в себя такие вещи, как «title:» и прочее, это может быть довольно сложно. Если это только AND и OR из вашего примера, то это рекурсивная функция, которая не слишком сложная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...