Как указать два Поля в Lucene QueryParser?

Я читал, Как включить несколько полей в QueryParser? но я не получил его.

В данный момент у меня есть очень странная конструкция как:

parser = New QueryParser("bodytext", analyzer)
parser2 = New QueryParser("title", analyzer)
query = parser.Parse(strSuchbegriff)
query2 = parser.Parse(strSuchbegriff)

Что может я делать для чего-то как:

parser = New QuerParser ("bodytext" , "title",analyzer)
query =parser.Parse(strSuchbegriff) 

таким образом, Синтаксический анализатор ищет ищущее слово в поле "основной текст" в поле "заголовок".

63
задан Community 23 May 2017 в 11:33
поделиться

1 ответ

Рекурсивная функция имеет производительность O (n ^ 2), поскольку копирует оставшееся содержимое последовательности каждый раз при обнаружении совпадения. Это медленнее, чем итеративное решение O (n), и излишне.

Вы можете легко переписать его, чтобы он был быстрее, и в то же время упростить код и расширить его функциональность, передав функции начальный индекс для поиска в качестве необязательного параметра:

def countSubStringMatchRecursive(target, key, start_index = 0):
    index = target.find(key, start_index)
    if index >= 0:
        return countSubStringMatchRecursive(target, key, index + len(key)) + 1
    return 0

target_string = 'an apple and a banana'
key = 'an'
count = countSubStringMatchRecursive(target_string,  key)
print "Number of instances of %r in %r is %d" % (key, target_string, count)

Output:

Number of instances of 'an' in 'an apple and a banana' is 4

Update: Если вы действительно хотите использовать функцию поиска модуля последовательности, вы можете сделать это, просто изменив одну строку:

index = find(target, key, start_index)
-121--2433159-

Как насчет этого?

def count_it(target, key):
    index = target.find(key)
    if index >= 0:
        return 1 + count_it(target[index+len(key):], key)
    else:
        return 0


print count_it("aaa bbb aaa ccc aaa", "aaa")

Вывод:

3
-121--2433165-

Есть 3 способа сделать это.

Первый способ состоит в том, чтобы создать запрос вручную, это то, что QuureParser делает внутри. Это самый мощный способ сделать это, и означает, что вам не нужно анализировать пользовательский ввод, если вы хотите запретить доступ к некоторым из более экзотических функций QuureParser :

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("bodytext", "<text>"));
Query query2 = new TermQuery(new Term("title", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);

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

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                        new string[] {"bodytext", "title"},
                                        analyzer);

Hits hits = searcher.Search(queryParser.parse("<text>"));

Последний способ - использовать специальный синтаксис QuureParser см. здесь .

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);    

Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't 
// prefix it with a field.
string special = "bodytext:" + text + " OR title:" + text;

Hits hits = searcher.Search(queryParser.parse(special));

Другой вариант - создать новое поле при индексации содержимого под названием bodytextandtitle, в которое можно поместить содержимое как bodytext, так и title, тогда нужно искать только одно поле.

150
ответ дан 24 November 2019 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: