NLP 自然语言处理

NLP 自然语言处理 #

搜索引擎的核心挑战是理解人类语言。本文介绍 NLP(Natural Language Processing)在 Easysearch 中的应用,从基础的分词到高级的向量语义搜索。

NLP 在搜索中的角色 #

用户输入: "我想买一台便宜的笔记本电脑"
              ↓
  NLP 处理层(分词、去停用词、同义词、向量化)
              ↓
  Easysearch 查询执行
              ↓
  返回相关结果(包括 "laptop"、"notebook"、"手提电脑" 等)

Easysearch 中 NLP 的应用可以分为三个层次:

层次技术实现方式
词级处理分词、词干提取、停用词内置分析器
语言规则同义词、拼音、模糊匹配分析器插件
语义理解向量检索、文本嵌入AI 集成 / kNN

第一层:分词与文本分析 #

分词是 NLP 的基础——将连续文本切分为独立的词项(Token)。

中文分词 #

中文没有空格分隔,需要专用分词器:

PUT /my-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ik_smart_analyzer": {
          "type": "custom",
          "tokenizer": "ik_smart"
        }
      }
    }
  }
}

测试分词效果:

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "INFINI Easysearch 是分布式搜索引擎"
}

# 输出词项: ["infini", "easysearch", "是", "分布式", "搜索引擎"]

Easysearch 内置的 IK 分析器支持两种粒度:

分词器粒度示例
ik_smart粗粒度(最少切分)“中华人民共和国” → [“中华人民共和国”]
ik_max_word细粒度(最多切分)“中华人民共和国” → [“中华人民共和国”, “中华人民”, “中华”, “人民共和国”, “人民”, “共和国”]

详见 文本分析

词干提取(Stemming) #

将单词还原到词干形式,提高召回率:

running → run
searches → search
better → better (不规则变化需要词典)

详见 词干化

停用词 #

去除对搜索无意义的高频词(“的”、“是”、“the”、“a”):

{
  "analysis": {
    "filter": {
      "my_stop": {
        "type": "stop",
        "stopwords": ["的", "了", "在", "是", "我"]
      }
    }
  }
}

详见 停用词

第二层:语言增强 #

同义词 #

让 “手机”、“手提电话”、“mobile phone” 互相匹配:

{
  "analysis": {
    "filter": {
      "my_synonyms": {
        "type": "synonym",
        "synonyms": [
          "手机,手提电话,mobile phone",
          "笔记本,laptop,notebook"
        ]
      }
    }
  }
}

详见 同义词

拼音搜索 #

通过拼音插件,支持拼音首字母和全拼搜索:

"刘德华" → 可通过 "ldh" 或 "liudehua" 搜索到

模糊匹配 #

容忍拼写错误:

{
  "query": {
    "fuzzy": {
      "name": {
        "value": "esysearch",
        "fuzziness": 1
      }
    }
  }
}

详见 模糊搜索

第三层:语义搜索 #

传统关键词搜索依赖词项精确匹配,无法理解语义。语义搜索通过向量嵌入(Embedding)解决这个问题。

基本流程 #

文本 → Embedding 模型 → 向量 [0.12, -0.34, 0.56, ...]
                              ↓
               存入 Easysearch knn_dense_float_vector 字段
                              ↓
             使用 knn_nearest_neighbors 查询最近邻

向量字段定义 #

PUT /semantic-index
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "title_vector": {
        "type": "knn_dense_float_vector",
        "knn": {
          "dims": 768,
          "model": "lsh",
          "similarity": "cosine",
          "L": 99,
          "k": 1
        }
      }
    }
  }
}

kNN 搜索 #

GET /semantic-index/_search
{
  "query": {
    "knn_nearest_neighbors": {
      "field": "title_vector",
      "vec": {
        "values": [0.12, -0.34, ...]
      },
      "model": "lsh",
      "similarity": "cosine",
      "candidates": 50
    }
  }
}

混合搜索 #

将关键词搜索与向量搜索结合,兼顾精确性和语义理解:

GET /my-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn_nearest_neighbors": {
            "field": "title_vector",
            "vec": { "values": [...] },
            "model": "lsh",
            "similarity": "cosine",
            "candidates": 50
          }
        }
      ],
      "should": [
        { "match": { "title": "搜索引擎" } }
      ]
    }
  }
}

詳見 向量搜索AI 集成

选型建议 #

场景推荐方案复杂度
中文关键词搜索IK 分词 + 同义词
多语言搜索对应语言的分析器
拼写纠错fuzzy + suggest
语义搜索 / 问答Embedding + kNN
最佳效果混合搜索(关键词 + 向量)

延伸阅读 #

最佳实践 #