当前位置: 首页 > 面试题库 >

Elasticsearch完成建议使用多词输入进行搜索

方和豫
2023-03-14
问题内容

使用Elasticsearch完成建议程序时,我在返回与一词查询匹配的多词输入建议时遇到问题。

示例结构:

PUT /test_index/
{
   "mappings": {
      "item": {
         "properties": {
            "test_suggest": {
               "type": "completion",
               "index_analyzer": "whitespace",
               "search_analyzer": "whitespace",
               "payloads": false
            }
         }
      }
   }
}

PUT /test_index/item/1
{
   "test_suggest": {
      "input": [
         "cat dog",
         "elephant"
      ]
   }
}

工作查询:

POST /test_index/_suggest
{
    "test_suggest":{
        "text":"cat",
        "completion": {
            "field" : "test_suggest"
        }
    }
}

结果

{
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "test_suggest": [
      {
         "text": "cat",
         "offset": 0,
         "length": 3,
         "options": [
            {
               "text": "cat dog",
               "score": 1
            }
         ]
      }
   ]
}

查询失败:

POST /test_index/_suggest
{
    "test_suggest":{
        "text":"dog",
        "completion": {
            "field" : "test_suggest"
        }
    }
}

结果

{
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "test_suggest": [
      {
         "text": "dog",
         "offset": 0,
         "length": 3,
         "options": []
      }
   ]
}

我希望得到与工作查询相同的结果,匹配“猫狗”。有什么建议是什么问题,以及如何使失败的查询正常工作?当使用标准分析器而不是空白分析器时,我得到相同的结果。我想每个输入字符串使用多个单词,如上面的示例所示。


问题答案:

完成建议器是前缀建议器,这意味着它会尝试将您的查询与输入的前几个字符进行匹配。如果要发布的文档与文本“
dog”匹配,则需要指定“ dog”作为输入。

PUT /test_index/item/1
{
   "test_suggest": {
      "input": [
         "cat dog",
         "elephant",
         "dog"
      ]
   }
}

以我的经验,必须指定输入以进行匹配的局限性使得完成建议者的作用不如其他实现前缀匹配的方式有用。为此,我喜欢边缘ngram。我最近写了一篇有关使用ngram的博客文章,您可能会发现有帮助:http : //blog.qbox.io/an-introduction-to-
ngrams-in-elasticsearch

作为一个简单的示例,您可以使用以下映射

PUT /test_index
{
   "settings": {
      "analysis": {
         "filter": {
            "edge_ngram_filter": {
               "type": "edge_ngram",
               "min_gram": 2,
               "max_gram": 20
            }
         },
         "analyzer": {
            "edge_ngram_analyzer": {
               "type": "custom",
               "tokenizer": "standard",
               "filter": [
                  "lowercase",
                  "edge_ngram_filter"
               ]
            }
         }
      }
   },
   "mappings": {
      "item": {
         "properties": {
            "text_field": {
               "type": "string",
               "index_analyzer": "edge_ngram_analyzer",
               "search_analyzer": "standard"
            }
         }
      }
   }
}

然后像这样索引文档:

PUT /test_index/item/1
{
   "text_field": [
      "cat dog",
      "elephant"
   ]
}

这些查询中的任何一个都将返回它:

POST /test_index/_search
{
    "query": {
        "match": {
           "text_field": "dog"
        }
    }
}

POST /test_index/_search
{
    "query": {
        "match": {
           "text_field": "ele"
        }
    }
}

POST /test_index/_search
{
    "query": {
        "match": {
           "text_field": "ca"
        }
    }
}

这是全部的代码:

http://sense.qbox.io/gist/4a08fbb6e42c34ff8904badfaaeecc01139f96cf



 类似资料:
  • 我想从多个领域得到建议。我找不到这样的例子,所以也许这不是最好的主意,但我对你的意见很感兴趣。 要求是: GET查询适用于文本“fyodor”和“dostoevsky”,此示例仅适用于“fyodor” 启用筛选建议 我有什么想法可以实现这些?

  • 我有一个记录数据库,每个记录都有一个右和一个左字段,这两个字段都包含文本。数据库使用Elasticsearch建立索引。 我想搜索这些记录的两个字段,并找到在任何字段中包含两个或更多带有特定前缀的单词的记录。搜索应该足够具体,以便只查找包含查询中所有单词的记录,而不仅仅是其中的一些单词。 例如,qui bro查询应该返回包含“敏捷的棕色狐狸跳过了懒惰的狗”这句话的记录,而不是包含“敏捷的狐狸跳过了

  • 在弹性搜索中,我将记录存储在命名空间和主题中。这些是简单的对象,只有(string)和。 我想通过自动完成搜索名称,为此我试图使用索引搜索。 ElasticSearch::Transport::Transport::Transport::Errors::BadRequest:[400]{“error”:{“root_cause”:[{“type”:“illegal_argument_excepti

  • 我想请你帮忙。我想搜索一个词里面的标题和内容。下面是结构 查询字符串如下所示,我希望在类似“15-game”的文本中搜索“15-g”: 请接受我的道歉,如果我重复的问题,但我无法找到发生了什么,为什么它没有返回任何结果。 我已经看过了: 提前谢谢你!

  • 我使用suggestbuilder获取关键字,然后扫描内容“field”,这里是由于没有结果而发生空指针异常的地方 为了得到结果,我是否遗漏了一些过滤器或输入标准?任何结果都应该确定,如自动完成或记录找到。 编辑1:

  • 问题内容: 可以说我索引了以下字符串: 对于输入,我想建议: 我 很棒 我的 啤酒 对于输入,我想建议: 很棒的 披萨 很棒的 啤酒 等等 因此,我想在用户输入后提供下一个单词…此外,还应支持一些模糊性( aEwsome )。 我应该使用哪些建议者/分析者?我尝试了 术语 和 完成, 但这不是我想要的(例如,完成仅在搜索词组的开头时有效- 如果我传递位于索引字符串中间的词,则不会建议) 问题答案: