gpt4 book ai didi

java - Lucene:多词短语作为搜索词

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:18 24 4
gpt4 key购买 nike

我正在尝试使用 Apache Lucene 制作可搜索的电话/本地企业目录。

我有街道名称、公司名称、电话号码等字段。我遇到的问题是,当我尝试按街道名称包含多个词(例如“新月”)的街道进行搜索时,没有结果被退回。但是,如果我尝试仅使用一个词进行搜索,例如“新月”,我会得到所有想要的结果。

我正在使用以下索引数据:

String LocationOfDirectory = "C:\\dir\\index";

StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_34);
Directory Index = new SimpleFSDirectory(LocationOfDirectory);

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE.34, analyzer);
IndexWriter w = new IndexWriter(index, config);


Document doc = new Document();
doc.add(new Field("Street", "the crescent", Field.Store.YES, Field.Index.Analyzed);

w.add(doc);
w.close();

我的搜索是这样的:

int numberOfHits = 200;
String LocationOfDirectory = "C:\\dir\\index";
TopScoreDocCollector collector = TopScoreDocCollector.create(numberOfHits, true);
Directory directory = new SimpleFSDirectory(new File(LocationOfDirectory));
IndexSearcher searcher = new IndexSearcher(IndexReader.open(directory);

WildcardQuery q = new WildcardQuery(new Term("Street", "the crescent");

searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;

我试过将通配符查询换成短语查询,首先使用整个字符串,然后将字符串拆分为空白并将它们包装在 BooleanQuery 中,如下所示:

String term = "the crescent";
BooleanQuery b = new BooleanQuery();
PhraseQuery p = new PhraseQuery();
String[] tokens = term.split(" ");
for(int i = 0 ; i < tokens.length ; ++i)
{
p.add(new Term("Street", tokens[i]));
}
b.add(p, BooleanClause.Occur.MUST);

然而,这并没有奏效。我尝试使用 KeywordAnalyzer 而不是 StandardAnalyzer,但随后所有其他类型的搜索也停止工作。我已经尝试用其他字符(+ 和@)替换空格,并将查询转换为这种形式,但仍然不起作用。我认为它不起作用,因为 + 和 @ 是没有索引的特殊字符,但我似乎无法在任何地方找到类似字符的列表。

我开始有点生气了,有人知道我做错了什么吗?

最佳答案

您无法取回文档的原因是,在编制索引时,您正在使用 StandardAnalyzer,它将标记转换为小写并删除停用词。因此,为您的示例编制索引的唯一术语是“新月”。但是,不分析通配符查询,因此“the”作为查询的必需部分包含在内。您场景中的短语查询也是如此。

KeywordAnalyzer 可能不太适合您的用例,因为它将整个字段内容作为单个标记。您可以将 SimpleAnalyzer 用于街道字段——它将拆分所有非字母字符的输入,然后将它们转换为小写。您还可以考虑将 WhitespaceAnalyzerLowerCaseFilter 结合使用。您需要尝试不同的选项,找出最适合您的数据和用户的选项。

此外,如果更改该字段的分析器会破坏其他搜索,您可以为每个字段使用不同的分析器(例如使用 PerFieldAnalyzerWrapper )。

关于java - Lucene:多词短语作为搜索词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066347/

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