当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch Edgrams偏好较短的术语

鄢子平
2023-03-14

我喜欢从Elasticsearch得到的结果,使用Edge-NGrams索引数据,并使用不同的分析器进行搜索。然而,我更希望匹配的较短术语比较长术语排名更高。

例如,以术语ABC100ABC100xxx为例。如果我使用术语abc执行查询,我会以相同的得分返回这两个文档。我希望ABC100的得分高于ABC100xxx,因为ABCcloser与ABC100的匹配类似于Levenshtein距离算法。

设置索引:

PUT stackoverflow
{
    "settings": {
        "index": {
            "number_of_replicas": 0,
            "number_of_shards": 1
        },
        "analysis": {  
            "filter": {
                "edge_ngram": {
                    "type": "edgeNGram",
                    "min_gram": "1",
                    "max_gram": "20"
                }
            },

            "analyzer": {
              "my_analyzer": {
                "type": "custom",
                "tokenizer": "whitespace",
                "filter": [
                  "edge_ngram"
                ]
              }
            }
        }
    },

    "mappings": {
        "doc": {
            "properties": {
                "product": {
                  "type": "text",
                  "analyzer": "my_analyzer",
                  "search_analyzer": "whitespace"
                }
            }
        }
    }
}

插入文档:

PUT stackoverflow/doc/1
{
    "product": "ABC100"
}

PUT stackoverflow/doc/2
{
    "product": "ABC100xxx"
}

搜索查询:

GET stackoverflow/_search?pretty
{
  "query": {
    "match": {
      "product": "ABC"
    }
  }
}

结果:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.28247002,
    "hits": [
      {
        "_index": "stackoverflow",
        "_type": "doc",
        "_id": "2",
        "_score": 0.28247002,
        "_source": {
          "product": "ABC100xxx"
        }
      },
      {
        "_index": "stackoverflow",
        "_type": "doc",
        "_id": "1",
        "_score": 0.28247002,
        "_source": {
          "product": "ABC100"
        }
      }
    ]
  }
}

有谁知道我是如何将ABC100等较短的术语排在ABC100xxx之前的吗?

共有1个答案

闾丘永春
2023-03-14

在找到了大量关于将字段长度存储为字段或使用脚本查询的不太理想的解决方案后,我找到了问题的根源。这只是因为我使用了edge_ngrams标记过滤器而不是edge_ngrams标记器。

 类似资料:
  • null 以下是文档 我在想--如果我不想偏向更短的文档,那么field.setomitnormals(true)足够吗?

  • 我有一个这样的旋转器: 当用户点击时,我希望它保存状态: 它将位置保存在SharedPref中,但微调器将返回默认值。有人看到什么了吗?

  • 通用设置 打开软件时 打开 Sketch 时,你需要创建一个新的文件,或者选择现有文件。 撤销 Sketch 会将多个相似的操作视为一组,比如你连续多次按下方向键以移动图层,但是只需一次撤销,即可恢复原来的位置。 字体渲染 当你为 Mac 或网页设计时,你会想打开子像素抗锯齿效果,但是为 iOS 设计时,你会想关掉它。 矢量导入 这个选项让你在导入 PDF 或者 EPS 的时候告诉 Sketch,

  • Navicat Data Modeler 提供一些选项让你自定义用户界面和性能。 若要打开偏好设置窗口,从菜单栏选择“Navicat Data Modeler”->“偏好设置”。

  • Navicat 为所有工具提供完整的自定义用户界面选项。 若要打开偏好设置窗口,请从菜单栏选择“Navicat XXX”->“偏好设置”。

  • 偏好设置 面板中提供了编辑器的个性化设置,要打开 偏好设置 面板,请从主菜单的 Cocos Creator 3D -> 偏好设置 菜单进入。 设置可以分成下列几部分: 通用设置 通用设置主要是针对编辑器相关的一些基础数据进行配置。 编辑器语言:可以选择中文或英文,修改语言设置后要重新启动 Cocos Creator 才能生效。 选择本机 IP 地址:用户可以在本机有多个 IP 地址的情况下,手动选