Java 包含/(斜杠)的指南针查询

Java 包含/(斜杠)的指南针查询,java,lucene,indexing,compass-lucene,Java,Lucene,Indexing,Compass Lucene,我在我的项目中使用基于指南针的索引。“名称”字段基于注释的配置为: @SearchableProperty(name="name") @SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED) private String name; 现在为“名称”字段存储以下值: 1. Temp 0 New n/a 2. e/f search 3. c/d search 现在不同场景的搜索结果如下: 1. 'c/d' ->

我在我的项目中使用基于指南针的索引。“名称”字段基于注释的配置为:

@SearchableProperty(name="name")
@SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED)
private String name;
现在为“名称”字段存储以下值:

1. Temp 0 New n/a
2. e/f search
3. c/d search
现在不同场景的搜索结果如下:

1. 'c/d' -> +(+alias:TempClass +(c/d*)) +(alias:TempClass) -> 1 record found
2. 'n/a' -> +(+alias:TempClass +(n/a*)) +(alias:TempClass) -> 0 record found
3. 'search' -> +(+alias:TempClass +(search*)) +(alias:TempClass) -> 2 records found
因此,当我尝试搜索“n/a”时,它应该搜索值为“Temp 0 New n/a”的第一条记录


任何帮助都将不胜感激

在某些情况下,您的查询分析与文档分析不匹配

最有可能的情况是,您在查询解析时在内部使用Lucene,但不是在索引时使用,原因如下:

@SearchableMetaData(name="ordering_name", index=Index.NOT_ANALYZED))
此分析器中使用的将字符
/
视为单词边界(例如空格),生成标记
n
a
。稍后,令牌
a
将由a移除

以下代码是此解释的示例(输入为
“c/d e/f n/a”
):

您将看到以下提取的令牌:

 1: [c]
 2: [d]
 3: [e]
 4: [f]
 5: [n]
请注意,缺少预期的位置6:with token
a
。如您所见,Lucene还执行此标记化:

QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new StandardAnalyzer(Version.LUCENE_36));
System.out.println(parser.parse("+n/a*"));
输出为:

+content:n
编辑:解决方案是使用,并将字段设置为“已分析”。以下代码是Lucene下的概念证明:

IndexWriter writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig(Version.LUCENE_36, new WhitespaceAnalyzer(Version.LUCENE_36)));
Document doc = new Document();
doc.add(new Field("content","Temp 0 New n/a", Store.YES, Index.ANALYZED));
writer.addDocument(doc);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
BooleanQuery query = new BooleanQuery();
QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new WhitespaceAnalyzer(Version.LUCENE_36));
TopDocs docs = searcher.search(parser.parse("+n/a"), 10);
System.out.println(docs.totalHits);
writer.close();

输出是:
1

我看到
(n/a*)
应该在哪里
(*n/a)
@Joop。。。请检查问题中的更新对不起,另一个(太)疯狂的猜测是:“n/a”可能不是值,但表示“不可用”的部件的toString。可能尝试搜索“/a”。也可以尝试将“新n/a”作为值。可能索引限制为10个字符。这是胡乱猜测。既然我们已经开始胡乱猜测。。。你知道正在使用什么分析仪吗?也许你的术语被削减为n a,而a作为标准分析器的停止词可能不会产生结果?现在我明白了,因为标准分析器,我的应用程序中到底发生了什么。有没有什么方法可以覆盖stopwords(我需要从stopword列表中删除'a')?或者任何其他解决这个问题的建议都将受到高度赞赏……我刚刚编辑了答案并给出了可能的解决方案。我希望有帮助!
IndexWriter writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig(Version.LUCENE_36, new WhitespaceAnalyzer(Version.LUCENE_36)));
Document doc = new Document();
doc.add(new Field("content","Temp 0 New n/a", Store.YES, Index.ANALYZED));
writer.addDocument(doc);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
BooleanQuery query = new BooleanQuery();
QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new WhitespaceAnalyzer(Version.LUCENE_36));
TopDocs docs = searcher.search(parser.parse("+n/a"), 10);
System.out.println(docs.totalHits);
writer.close();