这是我的架构
[ElasticType(Name = "importFile")] public class ImportFile : DocumentMapping { [ElasticProperty(Store = false, Index = FieldIndexOption.NotAnalyzed)] public string FileName { get; set; } [ElasticProperty(Store = false, Index = FieldIndexOption.NotAnalyzed)] public string GroupId { get; set; } [ElasticProperty(Store = false, Index = FieldIndexOption.Analyzed)] public string FilePath { get; set; } }
我做了这样的一个NEST查询:
var res = ElasticClient.Search<ImportFile>(s => s .Index(ElasticIndexName) .Filter(f => f.Term(t => t.FileName, "Group-1.uhh"))).Documents.ToArray();
并返回零元素!
如果我查看数据库(使用邮递员),则可以看到我的文档:
{ "took": 5, "timed_out": false, "_shards": { "total": 2, "successful": 2, "failed": 0 }, "hits": { "total": 2, "max_score": 14.069489, "hits": [ { "_index": "reviewer-bdd-test-index", "_type": "importFile", "_id": "AU9kUka2hr5Jg98UXOae", "_score": 14.069489, "_source": { "fileName": "Group-1.uhh", "groupId": "0ae1206d0644eabd82ae490e612732df5da2cd141fdee70dc64207f86c96094f", "filePath": "" } }, { "_index": "reviewer-bdd-test-index", "_type": "importFile", "_id": "AU9kZO25hr5Jg98UXRnk", "_score": 14.069489, "_source": { "fileName": "group-1.uhh", "groupId": "0ae1206d0644eabd82ae490e612732df5da2cd141fdee70dc64207f86c96094f", "filePath": "" } } ] } }
听起来您可能没有在为文档建立索引 之前 将类型的映射显式地放入索引中,所以Elasticsearch已基于所看到文档中字段的默认映射来推断该映射。例如,给定以下类型
[ElasticType(Name = "importFile")] public class ImportFile { [ElasticProperty(Store = false, Index = FieldIndexOption.NotAnalyzed)] public string FileName { get; set; } [ElasticProperty(Store = false, Index = FieldIndexOption.NotAnalyzed)] public string GroupId { get; set; } [ElasticProperty(Store = true, Index = FieldIndexOption.Analyzed)] public string FilePath { get; set; } }
如果我们按以下方式索引一些文档
void Main() { var settings = new ConnectionSettings(new Uri("http://localhost:9200")); var client = new ElasticClient(settings); client.Index<ImportFile>( new ImportFile{ FileName = "Group-1.uhh", FilePath = "", GroupId = "0ae1206d0644eabd82ae490e612732df" + "5da2cd141fdee70dc64207f86c96094" }, index => index .Index("reviewer-bdd-test-index") .Type("importFile") .Refresh()); client.Index<ImportFile>( new ImportFile { FileName = "group-1.uhh", FilePath = "", GroupId = "0ae1206d0644eabd82ae490e612732df" + "5da2cd141fdee70dc64207f86c96094" }, index => index .Index("reviewer-bdd-test-index") .Type("importFile") .Refresh()); var results = client.Search<ImportFile>(s => s .Index("reviewer-bdd-test-index") .Type("importFile") .Query(q => q .Filtered(fq => fq .Filter(f => f .Term(p => p.FileName, "Group-1.uhh") ) ) ) ); Console.WriteLine(string.Format("{0} {1}", results.RequestInformation.RequestMethod, results.RequestInformation.RequestUrl)); Console.WriteLine(Encoding.UTF8.GetString(results.RequestInformation.Request)); Console.WriteLine("Matching document count: {0}", results.Documents.Count()); }
在控制台中输出以下内容
POST http://localhost:9200/reviewer-bdd-test-index/importFile/_search { "query": { "filtered": { "filter": { "term": { "fileName": "Group-1.uhh" } } } } } Matching document count: 0
我们没有匹配的文件。在Elasticsearch中检查映射
curl -XGET "http://localhost:9200/reviewer-bdd-test-index/_mapping"
我们看到类型的映射importFile是
importFile
{ "reviewer-bdd-test-index": { "mappings": { "importFile": { "properties": { "fileName": { "type": "string" }, "groupId": { "type": "string" } } } } } }
这不是我们所期望的;fileName和两者groupId都应有"index": "not_analyzed",filePath甚至不在映射中。这两个都是因为Elasticsearch已根据传递的文档推断了映射- fileName并groupId已映射为字符串类型并且将使用标准分析器进行分析,并且 我相信 filePath尚未映射,因为两个看到的文档都为空字段的字符串值,因此应用于该字段的 标准分析器 不会为倒排索引生成任何标记,因此该字段不包含在映射中。
fileName
groupId
"index": "not_analyzed"
filePath
因此,为了确保一切正常,我们需要在索引任何文档之前向索引添加一个映射
void Main() { var settings = new ConnectionSettings(new Uri("http://localhost:9200")); var client = new ElasticClient(settings); // Add the mapping for ImportFile to the index client.CreateIndex(indexSelector => indexSelector .Index("reviewer-bdd-test-index") .AddMapping<ImportFile>(mapping => mapping .MapFromAttributes() ) ); // ... Same as above after this point }
导致
POST http://localhost:9200/reviewer-bdd-test-index/importFile/_search { "query": { "filtered": { "filter": { "term": { "fileName": "Group-1.uhh" } } } } } Matching document count: 1
成功! 我们有一个匹配的文件。检查Elasticsearch中的映射会产生我们期望的结果
{ "reviewer-bdd-test-index": { "mappings": { "importFile": { "properties": { "fileName": { "type": "string", "index": "not_analyzed" }, "filePath": { "type": "string", "store": true }, "groupId": { "type": "string", "index": "not_analyzed" } } } } } }
此外,可以将属性映射替换为流畅的映射
var indexResult = client.CreateIndex(indexDescriptor => indexDescriptor .Index("reviewer-bdd-test-index") .AddMapping<ImportFile>(mapping => mapping .Type("importFile") .MapFromAttributes() .Properties(properties => properties .String(s => s .Name(file => file.FileName) .Store(false) .Index(FieldIndexOption.NotAnalyzed)) .String(s => s .Name(file => file.GroupId) .Store(false) .Index(FieldIndexOption.NotAnalyzed)) .String(s => s .Name(file => file.FilePath) .Store(true)) ) ) );
属性映射或流畅映射都可以在这一点上完成,但是有些事情只能通过流畅映射来实现,例如 multi_fields 。