RavenDB:Keword分析器和.Search()命令

RavenDB:Keword分析器和.Search()命令,ravendb,Ravendb,我试图使用Search方法在RavenDB中进行查询,但遇到了一个问题,因为它完全忽略了KeywordAnalyzer设置。所以在我有 项目1 项目2 项目3 尝试搜索“项目1”会调出所有三个项目,尽管已将name字段上的analyzer设置为关键字analyzer,如下所示 Map = items => from item in items select new Result { Id = item.Id,

我试图使用
Search
方法在RavenDB中进行查询,但遇到了一个问题,因为它完全忽略了
KeywordAnalyzer
设置。所以在我有

  • 项目1
  • 项目2
  • 项目3
尝试搜索“项目1”会调出所有三个项目,尽管已将name字段上的analyzer设置为
关键字analyzer
,如下所示

Map = items => from item in items
               select new Result {
                   Id = item.Id,
                   Name = item.Name
               };

Index(i => i.Name, FieldIndexing.Analyzed);
Analyze(n => n.Name, "KeywordAnalyzer");
在这一点上,我使用这样的索引

var results = RavenSession
    .Query<Models.Items.Item, Indexes.Item__ByName>()
    .Customize(c => c.WaitForNonStaleResults())
    .Search(n => n.Name, name)
    .ToList();
var结果=RavenSession
.Query()
.Customize(c=>c.WaitForNonSaleResults())
.Search(n=>n.Name,Name)
.ToList();

我的期望是,当我搜索“项目1”时,我只返回“
项目1
”。并非所有其他项目。但这似乎没有听我说。

这是因为您有两个相互冲突的定义:

Index(i => i.Name, FieldIndexing.Analyzed);
Analyze(n => n.Name, "KeywordAnalyzer");
第一个命令告诉它使用StandardAnalyzer,第二个关键字分析器


删除第一行即可设置。

这是因为有两个相互冲突的定义:

Index(i => i.Name, FieldIndexing.Analyzed);
Analyze(n => n.Name, "KeywordAnalyzer");
第一个命令告诉它使用StandardAnalyzer,第二个关键字分析器


删除第一行即可设置。

不幸的是,这不起作用。它仍然使用单词的各个部分;如果我输入“1”,它只会调出
”。但在实际运行的代码中,正如我上面所展示的,它仍然可以找到其他两项。这本身就是这个字段没有使用KeywordAnalyzer的证据。如果将“1”作为查询,则KeywordAnalyzer将无法找到“Item 1”。我将尝试进行失败的测试。Where和Search之间的唯一区别在于对用于查询的文本进行分析,它们都将使用相同的查询大小运算符。遗憾的是,这不起作用。它仍然使用单词的各个部分;如果我输入“1”,它只会调出
”。但在实际运行的代码中,正如我上面所展示的,它仍然可以找到其他两项。这本身就是这个字段没有使用KeywordAnalyzer的证据。如果将“1”作为查询,KeywordAnalyzer将无法找到“Item 1”。我将尝试进行失败的测试。Where和Search之间的唯一区别在于对用于查询的文本进行分析,它们都将同样遵守查询大小运算符。