Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nest SuggestCompletion用法,抛出';不是完成建议字段';例外_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# Nest SuggestCompletion用法,抛出';不是完成建议字段';例外

C# Nest SuggestCompletion用法,抛出';不是完成建议字段';例外,c#,elasticsearch,nest,C#,elasticsearch,Nest,我是elasticsearch的完全初学者,我一直在尝试使用elasticsearch的完成建议,使用Nest在一个属性上自动完成 以下是我的映射(如上所述:): var createResult=client.CreateIndex(indexName,index=>index .AddMapping(tmd=>tmd .Properties(props=>props .完成时间(s=> s、 名称(p=>p.CompanyName.Suffix(“完成”)) .指数分析仪(“标准”) .Se

我是elasticsearch的完全初学者,我一直在尝试使用elasticsearch的完成建议,使用Nest在一个属性上自动完成

以下是我的映射(如上所述:):

var createResult=client.CreateIndex(indexName,index=>index
.AddMapping(tmd=>tmd
.Properties(props=>props
.完成时间(s=>
s、 名称(p=>p.CompanyName.Suffix(“完成”))
.指数分析仪(“标准”)
.SearchAnalyzer(“标准”)
.MaxInputLength(20)
.有效载荷()

.s分隔符())
)
)
);
var resultPerson=client.IndexMany(documents.OfType(),新的SimpleBulkParameters{Refresh=true});
var resultCompany=client.IndexMany(documents.OfType(),新的SimpleBulkParameters{Refresh=true});
编制索引时,我只是使用
IndexMany
方法并传递
IEnumberable
(Contact有一个名为CompanyName的属性,Contact是一个抽象类,Person和Company都是它的具体实现)。搜索抛出异常,表示ElasticSearchException[字段[companyName]不是完成建议字段]。查询如下所示:

SearchDescriptor descriptor=新的SearchDescriptor();
descriptor=descriptor.SuggestCompletion(“suggest”,c=>c.OnField(f=>f.CompanyName).Text(q));
var result=getElasticClientInstance(“联系人”).Search(body=>descriptor);
字符串qe=result.ConnectionStatus.ToString();
我在这里做错了什么,我查看了Nest关于
SuggestCompletion
的测试,但没有多少帮助,这意味着测试只描述了如何获得建议,而没有描述如何设置SuggestCompletion的索引映射

我还尝试设置了本文中提到的
edgeNgram
tokenizer,但也无法继续


任何关于如何继续的指导或示例都会非常有帮助。

更新

您正在尝试创建名为“companyName.completion”的属性,但在该位置无效,它将使用最后一个标记“completion”。所以它实际上映射了一个称为completion的字段。。。。尝试将调用更改为:
.Name(p=>p.CompanyName)

其他观察结果

您可以为
联系人
指定映射,但在索引时使用
人员
公司
类型

在您映射的elasticsearch术语中:

/index/contact/

但您的文档将进入:

/index/person/
/index/company

NEST不会自动映射一个特定类的所有实现,elasticsearch无法知道这三个实现是相关的

我将重构映射到一个方法,并为所有涉及的类型调用它

 var createResult = client.CreateIndex(indexName, index => index                
      .AddMapping<Contact>(tmd => MapContactCompletionFields(tmd))
      .AddMapping<Person>(tmd => MapContactCompletionFields(tmd))
      .AddMapping<Company>(tmd => MapContactCompletionFields(tmd))   
  );

 private RootObjectMappingDescriptor<TContact>  MapContactCompletionFields<TContact>(
      RootObjectMappingDescriptor<TContact> tmd)
      where TContact : Contact
 {
      return  tmd.Properties(props => props
           .Completion(s => s
                .Name(p => p.CompanyName.Suffix("completion"))
                .IndexAnalyzer("standard")
                .SearchAnalyzer("standard")
                .MaxInputLength(20)
                .Payloads()
                .PreservePositionIncrements()
                .PreserveSeparators()
           )                        
       );
 } 
var createResult=client.CreateIndex(indexName,index=>index
.AddMapping(tmd=>MapContactCompletionFields(tmd))
.AddMapping(tmd=>MapContactCompletionFields(tmd))
.AddMapping(tmd=>MapContactCompletionFields(tmd))
);
私有RootObjectMappingDescriptor MapContactCompletionFields(
RootObjectMappingDescriptor(tmd)
where t联系人:Contact
{
返回tmd.Properties(props=>props
.完成时间(s=>s)
.Name(p=>p.CompanyName.后缀(“完成”))
.指数分析仪(“标准”)
.SearchAnalyzer(“标准”)
.MaxInputLength(20)
.有效载荷()

.分隔符()
)                        
);
} 
该方法返回描述符,以便可以在其上进一步链接

然后,当您搜索联系人时:

var result = getElasticClientInstance("contacts").Search<Contact>(
    body => descriptor
        .Types(typeof(Person), typeof(Company))
);
var result=getElasticClientInstance(“联系人”)。搜索(
正文=>描述符
.类型(个人类型、公司类型)
);
该类型提示将导致搜索查找
/index/person
/index/company
,并知道如何返回文档的协变列表


因此,您可以在上次通话后执行
result.Documents.OfType()

感谢您的回复。我仍然遇到同样的问题:ElasticSearchException[字段[companyName]不是一个完成建议字段]。这是我的查询:
StatusCode:InternalServerError,方法:POST,Url:http://192.168.1.105:9200/contacts/people/_search,请求:{“建议”:{“建议”:{“文本”:“土地”,“完成”:{“字段”:“公司名称”}}}}
。我不确定“人”是如何被视为“人”的,我不知道我在哪里提到过。公司也是一样,它显示为公司,联系人显示为联系人。查询中有两个“建议”可以吗?你能在回答中粘贴对的回答吗?或者作为github上的要点?啊,我明白了,您试图创建一个名为“companyName.completion”的属性,但在该位置无效,它将使用最后一个标记“completion”。所以它实际上映射了一个名为
completion
的字段。。。。尝试将呼叫更改为:
.Name(p=>p.CompanyName)
Wow,成功了,谢谢。现在,结果是显示所有对象的总点击数,是否应该只拉有此文本的对象?。根据我的查询,输出有建议,我不确定如何将建议显示给用户,我假设我需要查询建议字典。Yeah NEST目前只支持
\u search
端点上的建议,因此在搜索描述符
\u suggest
e上设置一个
.Size(0)