Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
830 views
in Technique[技术] by (71.8m points)

elasticsearch match all words from document in the search query

We can search for ALL words in a specific document.field like this:

{ "query" : { "match" : { "title": { "query" : "Black Nike Mens", "operator" : "and" } } } }

This will search for the words Black, Nike and Mens in the field title such that only those documents are returned that will have ALL these words in the title field.

But what I am trying to do is a little different.

I want to lookup such that if all the words of the title field of the document are present in my search query then it will return that document.

For e.g.

suppose there is a document with title : "Nike Free Sparq Mens White" in the elasticsearch database

now if I search with a query : "Nike Free Sparq 09 - Mens - White/Black/Varsity Red" then it should return this document, because all the words in the document.title do exist in my query

but if I search with a query : "Nike Free Lebron - Mens - White/Black" then it should NOT return the document because my query has the word Sparq missing

this is a sort of reverse-and-operator search

Is this possible? If yes, then how?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I finally got it to work but not with a direct method!

This is what I do:

  • Create a clean list of words from the source query, by:
    • change to lower case
    • replacing any special chars and punctuation with space
    • remove duplicate words
  • Search using normal match with OR operator for the words joined as a string
  • Now we will find the best relevant hits in result
  • We take those hits one by one and do a word to word search in php (or whatever programming language you use)
  • This word search will check for all the words of a document from the hits we just found, and match them with the words in source query; such that all words from hit document should be present in the source query string

This worked for me well enough!

Unless someone has a direct method from elasticsearch query language.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...