gpt4 book ai didi

java - Lucene 搜索两个或多个单词在 Android 上不起作用

转载 作者:行者123 更新时间:2023-12-01 12:49:45 24 4
gpt4 key购买 nike

我在 Android 上使用 Lucene 3.6.2。使用的代码和所做的观察如下。

索引代码:

public void indexBookContent(Book book, File externalFilesDir) throws Exception {
IndexWriter indexWriter = null;
NIOFSDirectory directory = null;

directory = new NIOFSDirectory(new File(externalFilesDir.getPath() + "/IndexFile", book.getBookId()));
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(LUCENE_36, new StandardAnalyzer(LUCENE_36));
indexWriter = new IndexWriter(directory, indexWriterConfig);

Document document = createFieldsForContent();

String pageContent = Html.fromHtml(decryptedPage).toString();
((Field) document.getFieldable("content")).setValue(pageContent);
((Field) document.getFieldable("content")).setValue(pageContent);
((Field) document.getFieldable("content")).setValue(pageContent.toLowerCase());
}

private Document createFieldsForContent() {
Document document = new Document();

Field contentFieldLower = new Field("content", "", YES, NOT_ANALYZED);
document.add(contentFieldLower);
Field contentField = new Field("content", "", YES, ANALYZED);
document.add(contentField);
Field contentFieldNotAnalysed = new Field("content", "", YES, NOT_ANALYZED);
document.add(contentFieldNotAnalysed);
Field recordIdField = new Field("recordId", "", YES, ANALYZED);
document.add(recordIdField);
return document;
}

public JSONArray searchBook(String bookId, String searchText, File externalFieldsDir, String filter) throws Exception {
List<SearchResultData> searchResults = null;
NIOFSDirectory directory = null;
IndexReader indexReader = null;
IndexSearcher indexSearcher = null;

directory = new NIOFSDirectory(new File(externalFieldsDir.getPath() + "/IndexFile", bookId));
indexReader = IndexReader.open(directory);
indexSearcher = new IndexSearcher(indexReader);

Query finalQuery = constructSearchQuery(searchText, filter);

TopScoreDocCollector collector = TopScoreDocCollector.create(100, false);
indexSearcher.search(finalQuery, collector);
ScoreDoc[] scoreDocs = collector.topDocs().scoreDocs;
}

private Query constructSearchQuery(String searchText, String filter) throws ParseException {
QueryParser contentQueryParser = new QueryParser(LUCENE_36, "content", new StandardAnalyzer(LUCENE_36));
contentQueryParser.setAllowLeadingWildcard(true);
contentQueryParser.setLowercaseExpandedTerms(false);

String wildCardSearchText = "*" + QueryParser.escape(searchText) + "*";

// Query Parser used.
Query contentQuery = contentQueryParser.parse(wildCardSearchText);
return contentQueryParser.parse(wildCardSearchText);
}

我已经经历过这个:“Lucene: Multi-word phrases as search terms”,我的逻辑似乎没有什么不同。

我的疑问是这些字段被覆盖了。另外,我需要与此代码一起使用的中文支持,除了两个或更多单词支持的问题。

最佳答案

前面有一点:

看到这样的搜索实现立刻就显得有点奇怪。对所有可用字符串进行线性搜索看起来过于复杂。我不知道你到底需要完成什么,但我怀疑你会更好地对你的文本进行适当的分析,而不是在关键字分析的文本上使用双通配符,这会表现不佳,并且不能提供太多的灵 active 搜索。

<小时/>

继续讨论更具体的问题:

您正在使用不同的分析方法多次分析同一领域的相同内容。

Field contentFieldLower = new Field("content", "", YES, NOT_ANALYZED);
document.add(contentFieldLower);
Field contentField = new Field("content", "", YES, ANALYZED);
document.add(contentField);
Field contentFieldNotAnalysed = new Field("content", "", YES, NOT_ANALYZED);
document.add(contentFieldNotAnalysed);

相反,如果您确实需要所有这些分析方法可用于搜索,您可能应该在不同的字段中对它们建立索引。一起搜索这些没有意义,因此它们不应该在同一字段中。

然后你就有了这种模式:

Field contentField = new Field("content", "", YES, ANALYZED);
document.add(contentField);
//Somewhat later
((Field) document.getFieldable("content")).setValue(pageContent);

不要这样做,这没有意义。只需将您的内容传递到构造函数中,然后将其添加到您的文档中即可:

Field contentField = new Field("content", pageContent, YES, ANALYZED);
document.add(contentField);

特别是如果您选择继续在同一字段中以多种方式进行分析,则无法从不同的 Field 实现中获取其中一个(getFieldable 将始终返回第一个 添加了一个)

这个查询:

String wildCardSearchText = "*" + QueryParser.escape(searchText) + "*";

正如您所提到的,不适用于多个术语。它与 QueryParser 语法发生冲突。你最终得到的结果类似于:*两个术语*,它将被搜索为:

field:*two field:terms*

这不会生成与您的关键字字段的任何匹配项(大概)。 QueryParser 根本不能很好地处理这种查询。您需要在此处自行构建通配符查询:

WildcardQuery query  = new WildcardQuery(new Term("field", "*two terms*"));

关于java - Lucene 搜索两个或多个单词在 Android 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24320641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com