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版本,解析的方式会有所不同
我猜你的问题就是上述原因之一。我一直在网上研究这个问题,已经看到一些搜索中不接受的字符集。这个我还没见过,但如果我找到了,我会把它作为答案贴出来。也许它考虑到了