Java 带空格和连字符的Lucene排序搜索
Lucene 8.0.0 我有一个字段,我正在这样索引:Java 带空格和连字符的Lucene排序搜索,java,lucene,Java,Lucene,Lucene 8.0.0 我有一个字段,我正在这样索引: doc.add(new SortedDocValuesField("nameS", new BytesRef(name.toLowerCase()))); doc.add(new StoredField("name", name)); London-UK Bristol-UK Bristol-AUS New York-USA Washington-USA String escapedSearch = QueryParserUtil.e
doc.add(new SortedDocValuesField("nameS", new BytesRef(name.toLowerCase())));
doc.add(new StoredField("name", name));
London-UK
Bristol-UK
Bristol-AUS
New York-USA
Washington-USA
String escapedSearch = QueryParserUtil.escape(search.toLowerCase())
Query query = qp.parse("nameS:" + escapedSearch + "*");
TopFieldDocs results = searcher.search(query, 100, new Sort(new SortField("nameS", Type.STRING)));
name的值如下所示:
doc.add(new SortedDocValuesField("nameS", new BytesRef(name.toLowerCase())));
doc.add(new StoredField("name", name));
London-UK
Bristol-UK
Bristol-AUS
New York-USA
Washington-USA
String escapedSearch = QueryParserUtil.escape(search.toLowerCase())
Query query = qp.parse("nameS:" + escapedSearch + "*");
TopFieldDocs results = searcher.search(query, 100, new Sort(new SortField("nameS", Type.STRING)));
所以它们有空格和连字符。然而,我似乎无法让我的搜索正常运行——当搜索到空格或连字符时,它似乎放弃了
我用于索引和搜索的分析器是标准分析器
我使用如下代码进行搜索:
doc.add(new SortedDocValuesField("nameS", new BytesRef(name.toLowerCase())));
doc.add(new StoredField("name", name));
London-UK
Bristol-UK
Bristol-AUS
New York-USA
Washington-USA
String escapedSearch = QueryParserUtil.escape(search.toLowerCase())
Query query = qp.parse("nameS:" + escapedSearch + "*");
TopFieldDocs results = searcher.search(query, 100, new Sort(new SortField("nameS", Type.STRING)));
允许搜索使用空格和连字符在哪里做错了?顺便说一句,我在索引和搜索时调用了
.toLowerCase()
,这是标准做法吗?您能分享一个源数据示例,显示可以找到这些术语的上下文吗?StandardAnalyzer
(请参阅)包括StandardTokenizer
,也为您提供toLower
。StandardTokenizer
打破了单词边界,还删除了一些标点符号。请参见“快速棕色狐狸”示例。因此,为分析和标记化提供建议,一些源数据上下文可能会有所帮助。此外,请记住,StandardAnalyzer
如何索引事物可能不会损害搜索。您的搜索使用与索引器相同的分析器,StandardAnalyzer
是否真的使搜索无法按您预期的方式工作?我应该先问一下。@andrewjames-我索引的不是“块”文本,而是提供的特定标记。文档来自JSON,其中每个字段都是一个精确的标记。所以你们可以想象:String name=“伦敦英国”。。。;doc.add(new StoredField(“name”,name))
我是基于SortedDocValuesField
字段进行查询的,该字段是BytesRef
-我应该基于字段name
进行查询,并且只使用名称
进行排序吗?