2015-11-04 62 views
0

我创建了两个索引时尚和手机与字段“名称”。如何在弹性搜索中匹配不匹配的单词,如“iphone手机”中的文档如“iphone”

client.indices.create(index='fashion',body={"mappings": {"doc": {"properties": {"name": {"type": "string"} } } } }) 
client.indices.create(index='mobiles',body={"mappings": {"doc": {"properties": {"name": {"type": "string"} } } } }) 

对于时尚,下面的文件被添加。

client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "i shirts" }}) 
client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "i celekon" }}) 
client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "satsung" }}) 

对于手机:

client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "apple iphone 6s" }}) 
client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "samsung galaxy s2" }}) 
client.index(index='mobiles',doc_type='blog',body={"query":{ "name": "apple iphone 5s" }}) 

当我用匹配查询搜索术语像

search="i phone" 
test=client.search(index='mobiles,fashion',doc_type='blog',size=10,body={"query": {"bool" : {"should" : [{"match": {"name": {"query":search,"slop": 10,"max_expansions": 2 }}},{"match_phrase_prefix": {"name": {"query":search,"slop": 10,"max_expansions": 2}}},{"match": {"name": {"query":search, "fuzziness":1}}}]}}}) 

我得到以下顺序结果..

我的衬衫,我celekon,苹果iphone 6s,苹果iphone 5s

我该如何跟踪结果?

苹果iPhone 6S,苹果iPhone 5S,....

如何 “亚马逊”, “flipkart” 实现这些类型的搜索?

注意:我用elasticsearch-py api来进行搜索。

回答

0

你必须创造条件,使用Word Delimiter Token Filter自定义分析:

命名word_delimiter,它分裂成字子词,并对子字组 可选的转换。字被分成 子词的规则如下:

  1. 分裂上字内的分隔符(默认情况下,所有的非字母数字
    字符)。 “Wi-Fi”→“Wi”,“Fi”
  2. 拆分大小写转换:“PowerShot”→“Power”,“Shot”
  3. 拆分字母数字转换:“SD500”→“SD”, “500”
  4. 领导和各子词尾字内的分隔符 忽略:“//你好---那里,花花公子”→“你好”,“有”,“花花公子”
  5. 后“的“每个子词被删除:‘奥尼尔的’→‘O’,‘尼尔’

我认为你正在寻找第二个例子。如果您编制索引iPhone,它会创建令牌"i""Phone",这正是您要查找的内容。

有一点要记住,你应该照顾"preserve_original"参数那里,并将其设置为true,所以它确实保留原始单词。这很重要,因为用户可以同时寻找我的手机和iPhone,它仍然会得分。

+0

如果“iphone”较低情况下,我们会怎么做呢@Evaldas Buinauskas – Println

+0

你以后这个权利适用'lowercase'令牌过滤器,那么iPhone iphone iphone和我的手机应该被视为相同的关键字。 –

相关问题