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

elasticsearch多字关键字标记同义词分析

阳光辉
2023-03-14

我试图用_analyze API获得关键字标记的多字同义词。API对单字同义词返回预期结果,但对多字同义词不返回预期结果。以下是我的设置和分析链:

curl -XPOST "http://localhost:9200/test" -d'
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "my_syn_filt": {
            "type": "synonym",
            "synonyms": [
              "foo bar, fooo bar", 
              "bazzz, baz"
            ]
          }
        },
        "analyzer": {
          "my_synonyms": {
            "filter": [
              "lowercase",
              "my_syn_filt"
            ],
            "tokenizer": "keyword"
          }
        }
      }
    }
  }
}'
curl 'localhost:9200/test/_analyze?analyzer=my_synonyms&text=baz'
{
  "tokens": [
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 3,
      "start_offset": 0,
      "token": "bazzz"
    },
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 3,
      "start_offset": 0,
      "token": "baz"
    }
  ]
}
curl 'localhost:9200/test/_analyze?analyzer=my_synonyms&text=foo+bar'
{
  "tokens": [
    {
      "position": 1,
      "type": "word",
      "end_offset": 7,
      "start_offset": 0,
      "token": "foo bar"
    }
  ]
}

为什么analyze API不返回具有同义词类型的“foo bar”和“fooo bar”标记?

共有1个答案

乌杰
2023-03-14

“tokenizer”:“keyword”key-value还需要添加到my_syn_filt过滤器声明中,如下所示:

curl -XPOST "http://localhost:9200/test" -d'
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "my_syn_filt": {
            "tokenizer": "keyword",
            "type": "synonym",
            "synonyms": [
              "foo bar, fooo bar", 
              "bazzz, baz"
            ]
          }
        },
        "analyzer": {
          "my_synonyms": {
            "filter": [
              "lowercase",
              "my_syn_filt"
            ],
            "tokenizer": "keyword"
          }
        }
      }
    }
  }
}'

通过上面的映射,_analyze API返回所需的同义词标记:

{
  "tokens": [
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 7,
      "start_offset": 0,
      "token": "foo bar"
    },
    {
      "position": 1,
      "type": "SYNONYM",
      "end_offset": 7,
      "start_offset": 0,
      "token": "fooo bar"
    }
  ]
}
 类似资料:
  • 问题内容: 我正在使用elasticsearch 1.1.2。 我在可搜索字段上使用具有不同权重的多重匹配查询。 例: {“ multi_match”:{“ query”:“这是一个测试”,“ fields”:[“ title ^ 3”,“ description ^ 2”,“ body”]}} 因此,在我的示例中,标题的重要性是正文的三倍。 我想根据找到的匹配项为每个字段自定义权重。 假设我搜索

  • 我正在寻找一种方法来搜索公司名称与关键字标记,但没有停止词。 例如:索引公司名称为“Hansel und Gretel Gmbh” 这里“und”和“Gmbh”是公司名称的停止词。 如果搜索项是"Hansel Gretel",则应找到该文档;如果搜索项是"Hansel",则不应找到任何文档。如果搜索词是"hansel gmbh",也应该找到no文档。 我曾尝试将关键字标记器与自定义分析器中的停止词

  • 问题内容: 我有一个已被标记的文本,或者一般来说,单词列表也是可以的。例如: 如果我有一个包含单个单词和多个单词键的Python字典,该如何有效且正确地检查其在文本中的存在?理想的输出应该是key:location_in_text对,或者是一些方便的东西。提前致谢! 附言:“正确”地解释-如果我的字典中有“租赁”,我不希望请打上标记。另外,需要识别复数。我想知道如果没有许多if-else子句,是否

  • 问题内容: 我目前正在尝试使我的java代码(使用eclipse)执行某些功能(如果说了某件事)。我正在使用Sphinx4库,这是我目前拥有的: 我想做的是在它说的那行: 如果我的发言是Hello Computer,Hello Jarvis,Good Morning Computer或Good Morning Jarvis,则运行该功能。或者换句话说,如果语音与.gram文件中的“ public

  • 问题内容: 编辑:要补充一点,同义词似乎可以与基本的查询字符串查询一起使用。 这将返回新罕布什尔州的所有结果,但对“ nh”的“匹配”查询将不返回结果。 我正在尝试将同义词添加到我的Elastic索引中的位置字段中,这样,如果我对“质量”,“马”或“马萨诸塞州”进行位置搜索,则每次都会得到相同的结果。我将同义词过滤器添加到设置中,并更改了位置映射。这是我的设置: 以及location.region