是否可以动态使用elasticsearch同义词?

问题描述 投票:0回答:2

我正在努力尝试在弹性搜索查询中实现同义词。 正如我在 Synonyms 中看到的,我可以在创建具有以下结构的索引时创建一个过滤器:

"sinonimos": {
  "type": "synonym",
  "explicit": false,
  "synonyms_path": "sinonimos.txt"
}

此过滤器正在分析器中使用,如果我理解正确,如果我的查询是“cellular”,“sinonimos.txt”中的任何单词都将被视为匹配,我错了吗?

在elasticsearch/config文件夹中创建文件“sinonimos.txt”,其内容如下:

smartphone, telefone => celular

知道我的索引字段中有 4 个不同的值,称为“descricao”:

  • 蜂窝网络
  • 智能手机
  • 电话
  • 手机

当我用新词“cellphone”修改“sinonimos.txt”文件,然后在索引中使用

_reload_search_analyzers
API时,是否也应该查询该词?

这里的主要问题是,我如何以动态的方式实现这个同义词,因此当我向单词或新的同义词列表添加新同义词时,我不必重新索引当前索引?

在这个Elastic Blog中,他们说

分析器中使用的同义词可以在索引时或搜索时使用。

它们之间的区别很明显,也在Elastic Blog中说过:

索引时间同义词有几个缺点:

  • 索引可能会变得更大,因为所有同义词都必须建立索引。
  • 依赖于术语统计的搜索评分可能会受到影响,因为同义词也被计算在内,并且不常见单词的统计数据会出现偏差。
  • 在不重新索引的情况下,无法更改现有文档的同义词规则。

另一方面,在搜索时间分析器中使用同义词不会出现上述许多问题:

  • 索引大小不受影响。
  • 语料库中的术语统计保持不变。
  • 同义词规则的更改不需要重新索引文档。

动态性的想法是,我将一直添加/删除新单词/单词列表,并且希望以动态方式执行此操作,这样我就不必重新索引或 _close > update > _open 索引。这可能吗?

编辑: 问题是我试图使用同义词分析器作为索引分析器,而不是使用它作为 search_analyzer。

elasticsearch synonym
2个回答
0
投票

有关 Elasticsearch 同义词标记过滤器的一些有用信息

"filter": {
  "synonym": {
    "type": "synonym_graph",
    "synonyms_path": "analysis/synonym.txt",  
    "updateable": true                        
  }
}

要更新同义词列表,请更新 synonym.txt 文件并调用

POST /index_name/_reload_search_analyzers
并清除请求缓存
POST /index_name/_cache/clear?request=true
由于重新加载会影响具有索引分片的每个节点,因此在使用此 API 之前更新集群中每个数据节点(包括不包含分片副本的节点)上的同义词文件非常重要。这可以确保在集群中的所有位置更新同义词文件,以防将来分片重新定位。 https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-reload-analyzers.html#indices-reload-analyzers-api-desc

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "my_synonyms": {
            "tokenizer": "whitespace",
            "filter": [ "synonym" ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym_graph",
            "synonyms_path": "analysis/synonym.txt",  
            "updateable": true                        
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "my_synonyms"              
      }
    }
  }
}
'

建议:设置

profile:true
并检查结果。您将看到 search_analyzer 的匹配字段。

GET test_synonym/_search
{
  "profile": true,
  "query": {
    "match": {
      "text": {
        "query": "test search",
        "analyzer": "my_synonyms"
      }
    }
  }
}

0
投票

当您使用 updatable true 时,您将能够 重新加载分析器,而无需关闭索引。

医生:

您可以使用重新加载搜索分析器 API 来获取对 synonym_graph 或同义词标记过滤器中使用的同义词文件 搜索分析器。要符合资格,令牌过滤器必须具有 可更新标志为 true,仅用于搜索分析器。

© www.soinside.com 2019 - 2024. All rights reserved.