C# Lucene没有';t搜索具有'_';

C# Lucene没有';t搜索具有'_';,c#,.net,lucene.net,C#,.net,Lucene.net,可能重复: 我在应用程序中使用Lucene全文搜索进行搜索 但例如,如果我搜索“Turbo_Boost”,它将返回0个结果 对于其他文本,它可以很好地工作 有什么想法吗?假设您正在使用,它将在下划线字符上拆分 您可以通过将下划线保留在返回的中(通过组合Filter实例或TokenFilter实例)来解决此问题。假设您使用,它将在下划线字符上拆分 您可以绕过这一点,通过它将下划线保留在返回的中(可以通过组合Filter实例或TokenFilter实例)。Lucene的一般经验法则是使用用于索引数

可能重复:

我在应用程序中使用Lucene全文搜索进行搜索

但例如,如果我搜索“Turbo_Boost”,它将返回0个结果

对于其他文本,它可以很好地工作


有什么想法吗?

假设您正在使用,它将在下划线字符上拆分


您可以通过将下划线保留在返回的中(通过组合
Filter
实例或
TokenFilter
实例)来解决此问题。

假设您使用,它将在下划线字符上拆分


您可以绕过这一点,通过它将下划线保留在返回的中(可以通过组合
Filter
实例或
TokenFilter
实例)。

Lucene的一般经验法则是使用用于索引数据的相同标记器/分析器标记您的搜索查询


请参见

Lucene的一般经验法则是使用与索引数据相同的标记器/分析器标记搜索查询


请参见

我只能想到几个查询失败的原因:

首先,也可能是最不可能的,考虑到其他文本搜索很好,您没有设置要分析的文档字段。它不会被标记化,因此您只能根据整个字段的确切值进行搜索。再说一次,这可能不是你的问题

第二个(与第三个相关)很可能取决于您执行搜索的方式。如果您没有使用
QueryParser
(如果构造正确,它将以与索引文本相同的方式分析文本),而是说您使用的是
术语查询,如:

var tq = new TermQuery("Field", "Turbo_Boost");
这可能会导致您的搜索失败。这与
分析器有关,您使用该分析器对文档进行索引拆分,或在索引时更改“Turbo_Boost”的大小写,从而导致搜索时的字符串比较为f

第三个,更可能的是,与用于搜索的类相比,与用于索引项目的
Analyzer
类有关。使用相同的分析器很重要,因为每个分析器使用不同的
标记器
,将文本拆分为可搜索的术语

让我使用您自己的
Turbo\u Boost
查询为您提供一些示例,说明每个分析器如何将文本拆分为术语:

关键词分析器,空白分析器->字段:Turbo\u Boost

SimpleAnalyzer,StopAnalyzer->Field:turbo Field:boost

StandardAnalyzer->字段:涡轮字段:增压

您会注意到一些
分析器
正在分割下划线字符上的术语,而
关键字分析器
保留了它。搜索时使用相同的分析器是非常重要的,因为您可能不会得到相同的结果。它还可能导致问题,有时查询会找到结果,有时则不会,所有这些都取决于所使用的查询

作为旁注,如果您使用的是
StandardAnalyzer
,那么将相同的
Version
传递给
IndexWriter
QueryParser
,这一点也很重要,因为根据您希望模拟的Lucene版本,解析的方式会有所不同


我猜您的问题是上述原因之一。

我只能想到几个您的查询失败的原因:

首先,也可能是最不可能的,考虑到其他文本搜索很好,您没有设置要分析的文档字段。它不会被标记化,因此您只能根据整个字段的确切值进行搜索。再说一次,这可能不是你的问题

第二个(与第三个相关)很可能取决于您执行搜索的方式。如果您没有使用
QueryParser
(如果构造正确,它将以与索引文本相同的方式分析文本),而是说您使用的是
术语查询,如:

var tq = new TermQuery("Field", "Turbo_Boost");
这可能会导致您的搜索失败。这与
分析器有关,您使用该分析器对文档进行索引拆分,或在索引时更改“Turbo_Boost”的大小写,从而导致搜索时的字符串比较为f

第三个,更可能的是,与用于搜索的类相比,与用于索引项目的
Analyzer
类有关。使用相同的分析器很重要,因为每个分析器使用不同的
标记器
,将文本拆分为可搜索的术语

让我使用您自己的
Turbo\u Boost
查询为您提供一些示例,说明每个分析器如何将文本拆分为术语:

关键词分析器,空白分析器->字段:Turbo\u Boost

SimpleAnalyzer,StopAnalyzer->Field:turbo Field:boost

StandardAnalyzer->字段:涡轮字段:增压

您会注意到一些
分析器
正在分割下划线字符上的术语,而
关键字分析器
保留了它。搜索时使用相同的分析器是非常重要的,因为您可能不会得到相同的结果。它还可能导致问题,有时查询会找到结果,有时则不会,所有这些都取决于所使用的查询

作为旁注,如果您使用的是
StandardAnalyzer
,那么将相同的
Version
传递给
IndexWriter
QueryParser
,这一点也很重要,因为根据您希望模拟的Lucene版本,解析的方式会有所不同


我猜你的问题就是上述原因之一。

我一直在网上研究这个问题,已经看到一些搜索中不接受的字符集。这个我还没见过,但如果我找到了,我会把它作为答案贴出来。也许它考虑到了