小编ifo*_*o20的帖子

尽管在索引和搜索上都使用小写过滤器,为什么我的弹性搜索前缀查询区分大小写?

问题

我正在使用 ElasticSearch 6.2.3 开发自动完成器。我希望使用以下优先级对查询结果(带有“名称”字段的页面列表)进行排序:

  1. “名称”开头的前缀匹配(前缀查询)
  2. “名称”(术语查询)中的任何其他完全(整个单词)匹配
  3. 模糊匹配(目前这是使用 ngram 分词器在与 Name 不同的字段上完成的......所以我认为与我的问题无关,但我也想将其应用于 Name 字段)

我尝试的解决方案

我将使用由三个查询组成的 Bool/Should 查询(对应于上面的三个优先级),并使用 boost 来定义相对重要性。

我遇到的问题是前缀查询 - 尽管我的搜索分析器具有小写过滤器,但它似乎没有小写搜索查询。例如,以下查询为“harry”返回“Harry Potter”,但为“Harry”返回零结果:

{ "query": { "prefix": { "Name.raw" : "Harry" } } }
Run Code Online (Sandbox Code Playgroud)

我已经使用_analyzeAPI 验证了我的两个分析器确实将文本“Harry”小写为“harry”。我哪里错了?

从 ES 文档中,我了解到我需要以两种不同的方式分析名称字段,以启用前缀和术语查询:

  1. 使用“关键字”标记器来启用前缀查询(我已将其应用于字段.raw

  2. 使用标准分析器启用术语(我已将其应用于“名称”字段)

我已经检查了诸如此之类的重复问题,但答案没有帮助

我的映射和设置如下

ES索引映射

{
    "myIndex": {
        "mappings": {
            "pages": {
                "properties": {
                    "Id": {},
                    "Name": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "text",
                                "analyzer": "keywordAnalyzer",
                                "search_analyzer": …
Run Code Online (Sandbox Code Playgroud)

elasticsearch

5
推荐指数
1
解决办法
5231
查看次数

建立一个大型的功能图?(F#)

我正在尝试构建一个F#控制台应用程序,它调用库来解决数学/编程问题的集合.

我的方法涉及构建一个求解器函数的大型映射(特别是a Map<int, (unit -> int)>).

然后应用程序只需要一个整数id并调用相应的解算器来显示解决方案(解决方案必须运行代码+运行一个计时器,因此不能只存储一个字符串).

我的初始设置如下所示.但是我知道随着我添加更多解决方案,这将很快变得混乱 - 在100个解决方案之后,我将拥有1,000条线路(并且看起来很难将它们一次添加到Map一行).

我正在考虑的一种方法是为每个问题创建一个.fs文件,并调用模块,例如Problem001.然后我会在Map构建函数中有~100行(例如Map.Add(1, Problem001.solver)).

我的问题是:上述想法是最好的方法(如果是这样,是否有更简洁的方法将所有不同的模块组合到一个Map中?)

如果没有,最好的方法是什么?

类库:Library.fs

namespace Library

module Problems = 
    let Titles = 
         Map.empty
             .Add(1, "Title1") // etc
    let Descriptions = 
         Map.empty
             .Add(1, "Desc1") // etc

module Solutions = 
    let solution1 () =
        // logic & solution annotation, unique to each problem
        printfn "Solution annotation/text"
        ans // return integer answer

    let solution2 () = // etc
        printfn "blah"
        ans

    let solvers = 
        Map.empty
            .Add(1, solution1) …
Run Code Online (Sandbox Code Playgroud)

f#

4
推荐指数
1
解决办法
93
查看次数

标签 统计

elasticsearch ×1

f# ×1