首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Elasticsearch中如何在查询时而不是索引时间使用同义词

在Elasticsearch中如何在查询时而不是索引时间使用同义词
EN

Stack Overflow用户
提问于 2017-02-06 15:39:19
回答 4查看 7.6K关注 0票数 12

根据elasticsearch参考文档,有可能:

可以在索引时或查询时应用扩展。每一个都有优点(⬆)︎和缺点(⬇)︎))。何时使用,这取决于性能与灵活性。

这些优点和缺点都是有意义的,对于我的具体使用,我想在查询时使用同义词。我的用例是,我希望允许系统中的管理用户管理这些同义词,而不必在更新时重新索引所有的内容。此外,我想这样做,而不关闭和重新打开索引。

我认为这有可能的主要原因是这一优势:

(可以更新⬆)︎同义词规则,而无需重新编制文档索引。

但是,我找不到任何描述如何在查询时而不是索引时应用同义词的文档。

要使用一个具体的示例,如果我执行以下操作(示例被盗并从参考文献中略作修改),这似乎会在索引时应用同义词:

代码语言:javascript
复制
/* NOTE: This was all run against elasticsearch 1.5 (if that matters; documentation is identical in 2.x) */

// Create our synonyms filter and analyzer on the index
PUT my_synonyms_test
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym_filter": {
          "type": "synonym",
          "synonyms": [
            "queen,monarch"
          ]
        }
      },
      "analyzer": {
        "my_synonyms": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "my_synonym_filter"
          ]
        }
      }
    }
  }
}

// Create a mapping that uses this analyzer
PUT my_synonyms_test/rulers/_mapping
{
  "properties": {
    "name": {
      "type": "string"
    },
    "title": {
      "type": "string",
      "analyzer": "my_synonyms"
    }
  }
}

// Some data
PUT my_synonyms_test/rulers/1
{
  "name": "Elizabeth II",
  "title": "Queen"
}

// A query which utilises the synonyms
GET my_synonyms_test/rulers/_search
{
  "query": {
    "match": {
      "title": "monarch"
    }
  }
}

// And we get our expected result back:
{
   "took": 42,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1.4142135,
      "hits": [
         {
            "_index": "my_synonyms_test",
            "_type": "rulers",
            "_id": "1",
            "_score": 1.4142135,
            "_source": {
               "name": "Elizabeth II",
               "title": "Queen"
            }
         }
      ]
   }
}

因此,我的问题是:如何修改上面的示例,以便在查询时使用同义词

还是我完全搞错了树,你能给我指点别的地方吗?我看过类似问题(如https://stackoverflow.com/a/34210587/2240218https://stackoverflow.com/a/18481495/2240218 )的答案中提到的插件,但它们似乎都有几年的历史,没有维护,所以我更愿意避免使用这些插件。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-06 15:43:31

只需在映射中使用search_analyzer而不是analyzer,同义词分析器只会在搜索时使用。

代码语言:javascript
复制
PUT my_synonyms_test/rulers/_mapping
{
  "properties": {
    "name": {
      "type": "string"
    },
    "title": {
      "type": "string",
      "search_analyzer": "my_synonyms"       <--- change this
    }
  }
}
票数 10
EN

Stack Overflow用户

发布于 2017-09-06 23:43:58

要在查询时而不是索引时间使用自定义同义词筛选器,首先需要从映射中删除分析器:

代码语言:javascript
复制
PUT my_synonyms_test/rulers/_mapping
{
  "properties": {
    "name": {
      "type": "string"
    },
    "title": {
      "type": "string"
    }
  }
}

然后,您可以使用分析器使用自定义同义词过滤器作为查询的一部分:

代码语言:javascript
复制
GET my_synonyms_test/rulers/_search
{
  "query": {
      "query_string": {
         "default_field": "title",
         "query": "monarch",
         "analyzer": "my_synonyms"
      }
  }
}

我相信query_string查询是唯一允许指定分析器的查询,因为它使用查询解析器来解析其内容。

正如您所说,仅在查询时使用分析器时,不需要对同义词集合的每次更改重新索引。

票数 2
EN

Stack Overflow用户

发布于 2018-03-22 11:51:35

除了使用search_analyzer之外,您还可以通过在同义词文件中进行更改后重新启动索引来刷新同义词列表。

下面是重新启动索引的命令

curl -XPOST 'localhost:9200/index_name/_close‘ curl -XPOST 'localhost:9200/index_name/_open‘

在此之后,您的同义词列表将被刷新,而不需要读取数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42071623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档