elasticsearch Elasticsearch中不区分大小写的字段,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch Elasticsearch中不区分大小写的字段,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch Elasticsearch中不区分大小写的字段

elasticsearch Elasticsearch中不区分大小写的字段,elasticsearch,nest,elasticsearch,Nest,我将NEST与ElasticSearch结合使用,并尝试通过允许用户在搜索框中键入搜索短语来进行搜索。除了当用户输入搜索短语时,他们需要确保字段名与弹性搜索中的字段名大小写相同之外,一切正常 例如,我的一个字段称为bookTitle。如果他们像下面这样搜索,那么它就工作了 书名:《双城记》 如果他们像下面的例子那样搜索,则不起作用 书名:《双城记》 书名:《双城记》 下面是我用来搜索的代码。有人对我如何解决这个问题有什么想法吗。我希望有一个ElasticSearch/NEST设置允许我这样做,而

我将NEST与ElasticSearch结合使用,并尝试通过允许用户在搜索框中键入搜索短语来进行搜索。除了当用户输入搜索短语时,他们需要确保字段名与弹性搜索中的字段名大小写相同之外,一切正常

例如,我的一个字段称为bookTitle。如果他们像下面这样搜索,那么它就工作了

书名:《双城记》

如果他们像下面的例子那样搜索,则不起作用

书名:《双城记》 书名:《双城记》

下面是我用来搜索的代码。有人对我如何解决这个问题有什么想法吗。我希望有一个ElasticSearch/NEST设置允许我这样做,而不是用搜索文本做一些丑陋的事情,比如查找“BookTitle”并替换为“BookTitle”

公共列表搜索(字符串搜索术语){
var results=\u client.Search(s=>s
.Query(q=>q
.QueryString(qs=>qs
.DefaultField(“内容”)
.Query(searchterm)
)
));
返回results.Documents.ToList();
}

非常感谢您的帮助。

使用Elasticsearch无法实现您想要的方式。您控制映射,您定义字段的名称,您是控制查询的人

根据这种判断,您需要注意用户将在搜索字段中键入什么,Elasticsearch开箱即用将字段名称小写或诸如此类的内容对您没有帮助

因此,无论您选择什么解决方案,它都将是一个解决方案

我的建议是定义一套规则,这些规则也应该传达给用户。围绕这些线:

  • 您的字段名都是小写的,或者
  • 您将映射定义为
    strict
    ,以便完全控制它
  • 您通知用户(在web界面或UI中)他们应该搜索给定一组规则的字段名(仅限小写,或仅限驼峰大小写等)
另一种方法是定义。在
QueryString
中,您不使用特定的字段名,ES将在默认设置下使用
query\u string
。这意味着ES将使用
\u all
,这是一个
\u all
字段,您知道它包含什么

为了说明这一点,但无论如何,我不推荐使用它,我认为可以使用
脚本
在Groovy中对字段名执行任何操作。但是,这意味着您将不会使用Elasticsearch的真正功能


教育您的用户并定义一组要遵守的规则,正如我上面提到的。

您可以将映射缓存在内存中的C#中,并确认从中找到了所有搜索字段。如果找不到精确匹配,请尝试查找最佳匹配字段。如果有多个选项可供选择,则抛出一个错误并要求用户更加具体


实际上,用户界面可以在键入时动态地执行此操作,并帮助他们选择正确的选项。

尚未将此作为产品质量进行测试,但理论上,您可以使用小写命名策略保存所有对象,并.ToLower()降低查询字段的大小,以便它们始终匹配

首先创建适当的命名策略:

public class LowercaseNamingStrategy : Newtonsoft.Json.Serialization.NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLower();
    }
}
以及相应的序列化程序:

    public class ElasticSerializer : JsonNetSerializer
    {
        public ElasticSerializer(IConnectionSettingsValues settings)
            : base(settings)
        {
            this.ContractResolver.NamingStrategy = new LowercaseNamingStrategy();
        }
    }
然后在NEST客户端的连接设置中使用序列化程序:

        var pool = new StaticConnectionPool([your nodes]);
        var settings = new ConnectionSettings(pool, s => new ElasticSerializer(s));
        var client = new ElasticClient(settings);
这将以小写形式存储字段。然后,当您查询时,只需强制所有用户提供的字段为小写,所有内容都应该对齐


如果您不是从头开始,您必须重新填充数据以保持命名策略的统一。

因此,如果我没有弄错您的问题,您的用户可以在您的输入框中指定一个完整的Lucene查询字符串,对吗?如果是这样的话,它对用户体验不是很友好,因为正如您看到的,您的用户不知道您选择了什么字段名。有多少字段是可搜索的,或者哪些字段是您希望搜索的?
        var pool = new StaticConnectionPool([your nodes]);
        var settings = new ConnectionSettings(pool, s => new ElasticSerializer(s));
        var client = new ElasticClient(settings);