- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是搜索长度为一或两个字符的查询文本。
这是我的索引设置。
"settings" : {
"index" : {
"number_of_shards" : "5",
"provided_name" : "my_user",
"analysis" : {
"filter" : {
"ngrammed" : {
"type" : "ngram",
"min_gram" : "3",
"max_gram" : "50"
}
},
"analyzer" : {
"ngrammed_ci" : {
"filter" : [
"lowercase",
"ngrammed"
],
"type" : "custom",
"tokenizer" : "standard"
},
"keyword_ci" : {
"filter" : [
"lowercase"
],
"type" : "custom",
"tokenizer" : "keyword"
}
}
}
}
}
我的一组用户具有以下分析器的显示名称字段。假设我有几个用户,例如
Allen
,
Alec
,
Kimball
,
Polly
我面临的问题是,当我使用2个字符长度的查询字符串(如
al
以及
Allen
和
Alec
)进行搜索时,它也与
Kimball
匹配,因为ngram过滤器在反向索引中将
Kimball
标记为
all
。我试图避免这种情况。还想知道是否有实现该功能的方法而无需更改事物的Index端的任何东西,而仅在查询端进行更改。
"user_display_name" : {
"type" : "text",
"fields" : {
"ci" : {
"type" : "text",
"analyzer" : "keyword_ci"
}
"cs" : {
"type" : "keyword"
}
},
"analyzer" : "ngrammed_ci",
"search_analyzer" : "standard"
}
最佳答案
在您的情况下,您需要从单词开头开始的ngram。在这种情况下,改为使用edge ngrams更有意义。
添加带有索引映射,索引数据,搜索查询和搜索结果的工作示例。
映射:
{
"settings": {
"analysis": {
"filter": {
"ngrammed": {
"type": "edge_ngram", <<-- note this
"min_gram": "2",
"max_gram": "50"
}
},
"analyzer": {
"ngrammed_ci": {
"filter": [
"lowercase",
"ngrammed"
],
"type": "custom",
"tokenizer": "standard"
},
"keyword_ci": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "keyword"
}
}
},
"index.max_ngram_diff": 50
},
"mappings": {
"properties": {
"user_display_name": {
"type": "text",
"fields": {
"ci": {
"type": "text",
"analyzer": "keyword_ci"
},
"cs": {
"type": "keyword"
}
},
"analyzer": "ngrammed_ci",
"search_analyzer": "standard"
}
}
}
}
将生成以下 token :
GET/_analyze
{
"analyzer" : "ngrammed_ci",
"text" : "Allen"
}
"tokens": [
{
"token": "al",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "all",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "alle",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "allen",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
}
]
索引数据:
{ "user_display_name" : "Allen" }
{ "user_display_name" : "Alec" }
{ "user_display_name" : "Kimball" }
{ "user_display_name" : "Polly" }
搜索查询:
{
"query": {
"query_string": {
"query": "al",
"default_field": "user_display_name"
}
}
}
搜索结果:
"hits": [
{
"_index": "my-index",
"_type": "_doc",
"_id": "1",
"_score": 1.0087044,
"_source": {
"user_display_name": "Allen"
}
},
{
"_index": "my-index",
"_type": "_doc",
"_id": "2",
"_score": 1.0087044,
"_source": {
"user_display_name": "Alec"
}
}
]
关于elasticsearch - 结合使用精确的前缀/匹配短语前缀查询和Ngram筛选器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63306161/
背景 :我通过索引标记化名称(name 字段)以及三元分析名称(ngram 字段),对名称字段实现了部分搜索。 我已经提升了 name字段具有精确的标记匹配冒泡到结果的顶部。 问题 :我正在尝试实现一
有人能给我指出解决以下问题的正确方向吗? 我有一个来自 UMLS 的巨大医学术语列表,即样本可能是 Disease control is good Disease control is poor Di
我都尝试过,当我测试分析仪时它们似乎产生相同的结果 settings: { analysis: { filter: { ngram_filter: {
我正在开始使用 R 中的 tm 包,所以请耐心等待,并对大段文字表示歉意。我创建了一个相当大的社会主义/共产主义宣传语料库,并希望提取新创造的政治术语(多个词,例如“斗争-批评-改造运动”)。 这是一
我有一个仇恨言论数据集,其中包含一些 10k 标记的推文:它看起来像这样 推文 |类 大家好 |不具攻击性 你这个丑陋的布偶 |攻击性但不是仇恨言论 你这该死的犹太人|仇恨言论 现在我正在尝试使用 S
我正在使用 Ngram 标记器,我已将 min_length 指定为 3 并将 max_length 指定为 5。但是,即使我尝试搜索长度大于 5 的单词,它仍然会给我结果。它很奇怪,因为 ES 不会
由于我是 Elasticsearch 的新手,我无法识别 ngram 标记过滤器 和边缘 ngram 标记过滤器。 这两个有什么区别处理 token ? 最佳答案 我认为 documentation对
我想识别一堆学术论文中的主要 n-gram,包括带有嵌套停用词的 n-gram,但不包括带有前导或尾随停用词的 n-gram。 我有大约 100 个 pdf 文件。我通过 Adobe 批处理命令将
我已经用 Javascript 构建了一个 ngram 模型实现,效果很好。但是,我希望更改我的数据结构,以便每次观察到新单词/字符时都不必遍历所有历史记录。 在这里,我获取一个种子文本并用它来构建阶
我正在使用Elastic Search索引包含两个字段的实体:agencyName和agencyAddress。 假设我已经索引了一个实体: { "agencyName": "Turismo
curl -XPUT 'http://localhost:9200/testsoundi' -d '{ "settings": { "analysis": { "analyzer": {
我正在尝试实现由ES索引提供支持的自动建议控件。该索引具有多个字段(多语言-阿拉伯语和英语),我希望能够以所有语言进行搜索。 最简单的方法是使用带有“_all”字段的NGram,只要在映射定义中有所注
我遵循this guide创建自动完成搜索...我正在做的是使用Edge NGram标记程序,对我的一个字段(标题)进行标记。我将这些Edge NGrams用于自动完成搜索this is my sol
在我的 ElasticSearch 数据集中,我们有以句点分隔的唯一 ID。样本编号可能类似于 c.123.5432 使用 nGram 我希望能够搜索:c.123.54 这不会返回任何结果。我相信标记
我想使用 Lucene API 从句子中提取 ngram。然而我似乎遇到了一个特殊的问题。在 JavaDoc有一个名为 NGramTokenizer 的类。我已经下载了 3.6.1 和 4.0 API
正如我在很多地方读到的,ngram 索引可以改进单词搜索。在这篇旧帖子中,它说它可以适用于 mysql,但没有说明如何:levenshtein alternative 任何人都可以举一些例子,因为你可
这是我现在拥有的代码,我使用的 csv 文件有两列,一列包含文本,一列包含它所属的对话编号。现在我已经设法从文本中获取不同的 ngram,但我还希望获得链接到 ngram 的对话数量。因此,如果一个
在 python 的 fasttext 库的描述中 https://github.com/facebookresearch/fastText/tree/master/python对于训练监督模型有不同
我正在写一个 R脚本并正在使用库(ngram)。 假设我有一个字符串, “质量好 狗粮 购买了重要的 jar 头 狗粮 产品发现质量好,产品看起来像炖肉,味道更好,拉布拉多菲尼奇鉴赏产品更好” 并想找
更新:感谢您的投入。我重写了这个问题并添加了一个更好的例子来突出我的第一个例子中没有涵盖的隐含要求。 问题 我要找一个将军tidy删除包含停用词的 ngram 的解决方案。简而言之,ngram 是由空
我是一名优秀的程序员,十分优秀!