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

Jim*_*ell 6 elasticsearch nest

我正在使用NEST和ElasticSearch,我尝试通过允许用户在搜索框中键入搜索短语来进行搜索.除了用户输入他们需要的搜索短语以确保字段名称与弹性搜索中的字段名称相同的情况之外,一切正常.

例如,我的一个字段叫做bookTitle.如果他们搜索如下,那么它的工作原理

bookTitle:"双城记"

如果他们像下面的例子一样搜索它不起作用

书签:"双城记"书名:"双城记"

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

   public List<ElasticSearchRecord> Search(string searchterm) {

        var results = _client.Search<ElasticSearchRecord>(s => s
                        .Query(q => q
                            .QueryString(qs => qs
                                .DefaultField("content")
                                .Query(searchterm)
                            )
                        ));


        return results.Documents.ToList();
    }
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

And*_*fan 2

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

根据这个判断,您需要注意用户将在搜索字段中输入的内容,开箱即用的 Elasticsearch 不会帮助您处理小写字段名称或类似的内容。

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

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

  • 您的字段名称全部小写或驼峰式
  • 您将映射定义为这样strict您就可以完全控制它
  • 您通知用户(在 Web 界面或 UI 中)他们应该在给定一组规则的情况下搜索字段名称(仅限小写字母或驼峰式大小写等)

另一种方法是定义该领域的内容_all。并且在您的代码中,QueryString您不使用特定的字段名称,ES 将使用query_string其默认设置。这意味着 ES 将使用_all,一个_all你知道它包含什么的字段。

只是为了提一下这一点但无论如何我不推荐它,我认为您可以使用 ascript对 Groovy 中的字段名称执行任何您想要的操作。但是,这意味着您将无法使用 Elasticsearch 的真正威力

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