elasticsearch 信息检索-如何处理单分词的搜索查询';被分割成多个标记,elasticsearch,search,lucene,information-retrieval,elasticsearch,Search,Lucene,Information Retrieval" /> elasticsearch 信息检索-如何处理单分词的搜索查询';被分割成多个标记,elasticsearch,search,lucene,information-retrieval,elasticsearch,Search,Lucene,Information Retrieval" />

elasticsearch 信息检索-如何处理单分词的搜索查询';被分割成多个标记

elasticsearch 信息检索-如何处理单分词的搜索查询';被分割成多个标记,elasticsearch,search,lucene,information-retrieval,elasticsearch,Search,Lucene,Information Retrieval,我只是一个信息检索的初学者 我希望解决一个问题,即用户在键入一个单词时错误地在字符之间添加空格或将两个单词合并为一个单词,但由于简单的反向索引查找,目前无法处理该问题 假设我对以下文件进行了反向索引: 杰克和吉尔是好朋友 杰克去了阿拉斯加 吉尔住在纽约 现在,使用反向索引意味着将纽约和纽约作为单独的标记进行索引(假设只是一个示例,并且没有使用NLP将纽约标记为位置) 现在查询杰克,我将得到位置1,2,这很好 但是对于查询newyork(假设查询没有空格),如何从包含位置3(组合)的索引中获取ne

我只是一个信息检索的初学者

我希望解决一个问题,即用户在键入一个单词时错误地在字符之间添加空格或将两个单词合并为一个单词,但由于简单的反向索引查找,目前无法处理该问题

假设我对以下文件进行了反向索引:

  • 杰克和吉尔是好朋友
  • 杰克去了阿拉斯加
  • 吉尔住在纽约
  • 现在,使用反向索引意味着将纽约纽约作为单独的标记进行索引(假设只是一个示例,并且没有使用NLP将纽约标记为位置)

    现在查询杰克,我将得到位置1,2,这很好

    但是对于查询newyork(假设查询没有空格),如何从包含位置3(组合)的索引中获取newyork

    对于查询alaska(带空格)如何分别检索标记alaska(索引中没有空格)

    任何我遗漏的建议或特定算法

    我只是一个信息检索的初学者

    谢谢你的帮助

    我正在考虑将每个查询标记分解为字符-语法组合,最后合并它们以找出最常见的标记

    例如查询纽约

    查找直到限制n的所有标记,从n开始。。。然后是新的…然后是新的。。。。然后是纽伊。。。。等等,类似于ne。。ew…wy..yo..或..rk

    合并后,最终将在某处获得新的和约克的


    类似地,对于queryala ska(用空格分隔单词))

    也许类似的方法对您适用:

    使用自定义分析器(ngramtokenizer)创建索引

    让我们发布新文档

    POST index/doc
    {
      "token": "alaska",
      "location":[4]
    }
    
    POST index/doc
    {
      "token": "york",
      "location":[3]
    }
    
    POST index/doc
    {
      "token": "new",
      "location":[3]
    }
    
    POST index/doc
    {
      "token": "jack",
      "location":[1,2]
    }
    
     POST index/doc
     {
       "token": "jill",
       "location":[1,2]
     }
    
    搜索:

    GET index/_search
    {
      "query": {
        "match": {
          "token": "ala ska"
        }
      }
    }
    
    结果:

    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1.9346048,
        "hits": [
          {
            "_index": "index",
            "_type": "doc",
            "_id": "z7hBMG4BXy8wPzqAcq-C",
            "_score": 1.9346048,
            "_source": {
              "token": "alaska",
              "location": [
                4
              ]
            }
          }
        ]
      }
    }
    

    嗨,谢谢你的回答!。但是你知道算法是如何工作的吗?或者你知道任何文档。感谢您解释ngram的工作原理。如果要实现自动完成搜索,也可以使用它。
    GET index/_search
    {
      "query": {
        "match": {
          "token": "ala ska"
        }
      }
    }
    
    {
      "took": 3,
      "timed_out": false,
      "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1.9346048,
        "hits": [
          {
            "_index": "index",
            "_type": "doc",
            "_id": "z7hBMG4BXy8wPzqAcq-C",
            "_score": 1.9346048,
            "_source": {
              "token": "alaska",
              "location": [
                4
              ]
            }
          }
        ]
      }
    }