How to retrieve the documents containing a specific term followed by another specific term in ElasticSearch?












0















I want to retrieve the document containing a specific term followed by another specific term. For example,
I have a index [index name: demo, type name: demo] in ElasticSeach, and it has 3 documents, like



doc1 "myfield": "AKKARK"
doc2 "myfield": "AKARK"
doc3 "myfield": "AKKAKARK"


the field myfield set a pattern tokenizer and the tokenizer will split the string after the letter k. So the inverted index is



AK -> doc1,doc2,doc3
K -> doc1,doc3
ARK -> doc1,doc2,doc3


I want to retrieve thoes documents containing AK followed by ARK and that is doc2 and doc3 not doc1.
I use query_string[AND] and I get doc1, doc2 and doc3. This is not what I want. So how to achieve my aim?



DEMO code:



PUT demo
{
"settings": {
"number_of_replicas": 0,
"number_of_shards": 1,
"analysis": {
"analyzer": {
"split_K_analyzer": {
"type": "pattern",
"pattern": "(?<=K)",
"lowercase": false
}
}
}
},
"mappings": {
"demo":{
"properties": {
"myfield": {
"type": "text",
"analyzer": "split_K_analyzer"
}
}
}
}
}

PUT demo/demo/_bulk
{"index":{"_id" : "doc1"}}
{"myfield": "AKKARK"}
{"index": {"_id": "doc2"}}
{"myfield": "AKARK"}
{"index": {"_id": "doc3"}}
{"myfield": "AKKAKARK"}

GET demo/demo/_search
{
"query": {
"query_string": {
"default_field": "myfield",
"query": "AK AND ARK"
}
}
}









share|improve this question





























    0















    I want to retrieve the document containing a specific term followed by another specific term. For example,
    I have a index [index name: demo, type name: demo] in ElasticSeach, and it has 3 documents, like



    doc1 "myfield": "AKKARK"
    doc2 "myfield": "AKARK"
    doc3 "myfield": "AKKAKARK"


    the field myfield set a pattern tokenizer and the tokenizer will split the string after the letter k. So the inverted index is



    AK -> doc1,doc2,doc3
    K -> doc1,doc3
    ARK -> doc1,doc2,doc3


    I want to retrieve thoes documents containing AK followed by ARK and that is doc2 and doc3 not doc1.
    I use query_string[AND] and I get doc1, doc2 and doc3. This is not what I want. So how to achieve my aim?



    DEMO code:



    PUT demo
    {
    "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1,
    "analysis": {
    "analyzer": {
    "split_K_analyzer": {
    "type": "pattern",
    "pattern": "(?<=K)",
    "lowercase": false
    }
    }
    }
    },
    "mappings": {
    "demo":{
    "properties": {
    "myfield": {
    "type": "text",
    "analyzer": "split_K_analyzer"
    }
    }
    }
    }
    }

    PUT demo/demo/_bulk
    {"index":{"_id" : "doc1"}}
    {"myfield": "AKKARK"}
    {"index": {"_id": "doc2"}}
    {"myfield": "AKARK"}
    {"index": {"_id": "doc3"}}
    {"myfield": "AKKAKARK"}

    GET demo/demo/_search
    {
    "query": {
    "query_string": {
    "default_field": "myfield",
    "query": "AK AND ARK"
    }
    }
    }









    share|improve this question



























      0












      0








      0








      I want to retrieve the document containing a specific term followed by another specific term. For example,
      I have a index [index name: demo, type name: demo] in ElasticSeach, and it has 3 documents, like



      doc1 "myfield": "AKKARK"
      doc2 "myfield": "AKARK"
      doc3 "myfield": "AKKAKARK"


      the field myfield set a pattern tokenizer and the tokenizer will split the string after the letter k. So the inverted index is



      AK -> doc1,doc2,doc3
      K -> doc1,doc3
      ARK -> doc1,doc2,doc3


      I want to retrieve thoes documents containing AK followed by ARK and that is doc2 and doc3 not doc1.
      I use query_string[AND] and I get doc1, doc2 and doc3. This is not what I want. So how to achieve my aim?



      DEMO code:



      PUT demo
      {
      "settings": {
      "number_of_replicas": 0,
      "number_of_shards": 1,
      "analysis": {
      "analyzer": {
      "split_K_analyzer": {
      "type": "pattern",
      "pattern": "(?<=K)",
      "lowercase": false
      }
      }
      }
      },
      "mappings": {
      "demo":{
      "properties": {
      "myfield": {
      "type": "text",
      "analyzer": "split_K_analyzer"
      }
      }
      }
      }
      }

      PUT demo/demo/_bulk
      {"index":{"_id" : "doc1"}}
      {"myfield": "AKKARK"}
      {"index": {"_id": "doc2"}}
      {"myfield": "AKARK"}
      {"index": {"_id": "doc3"}}
      {"myfield": "AKKAKARK"}

      GET demo/demo/_search
      {
      "query": {
      "query_string": {
      "default_field": "myfield",
      "query": "AK AND ARK"
      }
      }
      }









      share|improve this question
















      I want to retrieve the document containing a specific term followed by another specific term. For example,
      I have a index [index name: demo, type name: demo] in ElasticSeach, and it has 3 documents, like



      doc1 "myfield": "AKKARK"
      doc2 "myfield": "AKARK"
      doc3 "myfield": "AKKAKARK"


      the field myfield set a pattern tokenizer and the tokenizer will split the string after the letter k. So the inverted index is



      AK -> doc1,doc2,doc3
      K -> doc1,doc3
      ARK -> doc1,doc2,doc3


      I want to retrieve thoes documents containing AK followed by ARK and that is doc2 and doc3 not doc1.
      I use query_string[AND] and I get doc1, doc2 and doc3. This is not what I want. So how to achieve my aim?



      DEMO code:



      PUT demo
      {
      "settings": {
      "number_of_replicas": 0,
      "number_of_shards": 1,
      "analysis": {
      "analyzer": {
      "split_K_analyzer": {
      "type": "pattern",
      "pattern": "(?<=K)",
      "lowercase": false
      }
      }
      }
      },
      "mappings": {
      "demo":{
      "properties": {
      "myfield": {
      "type": "text",
      "analyzer": "split_K_analyzer"
      }
      }
      }
      }
      }

      PUT demo/demo/_bulk
      {"index":{"_id" : "doc1"}}
      {"myfield": "AKKARK"}
      {"index": {"_id": "doc2"}}
      {"myfield": "AKARK"}
      {"index": {"_id": "doc3"}}
      {"myfield": "AKKAKARK"}

      GET demo/demo/_search
      {
      "query": {
      "query_string": {
      "default_field": "myfield",
      "query": "AK AND ARK"
      }
      }
      }






      elasticsearch elastic-stack elasticsearch-5






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 '18 at 1:29







      huangjs

















      asked Nov 22 '18 at 13:18









      huangjshuangjs

      437




      437
























          1 Answer
          1






          active

          oldest

          votes


















          0














          Your search query returns all documents containing the tokens AK & ARK in the inverted index and this matches all the 3 docs and is working as expected.



          If you want to return documents containing AK followed by ARK you should use match_phrase query like below which returns doc2 and doc3 as they contain AK followed by ARK.



          GET /_search
          {
          "query": {
          "match_phrase" : {
          "myfield" : "AKARK"
          }
          }
          }





          share|improve this answer
























          • I can work well, thanks.

            – huangjs
            Nov 23 '18 at 1:32











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431895%2fhow-to-retrieve-the-documents-containing-a-specific-term-followed-by-another-spe%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          Your search query returns all documents containing the tokens AK & ARK in the inverted index and this matches all the 3 docs and is working as expected.



          If you want to return documents containing AK followed by ARK you should use match_phrase query like below which returns doc2 and doc3 as they contain AK followed by ARK.



          GET /_search
          {
          "query": {
          "match_phrase" : {
          "myfield" : "AKARK"
          }
          }
          }





          share|improve this answer
























          • I can work well, thanks.

            – huangjs
            Nov 23 '18 at 1:32
















          0














          Your search query returns all documents containing the tokens AK & ARK in the inverted index and this matches all the 3 docs and is working as expected.



          If you want to return documents containing AK followed by ARK you should use match_phrase query like below which returns doc2 and doc3 as they contain AK followed by ARK.



          GET /_search
          {
          "query": {
          "match_phrase" : {
          "myfield" : "AKARK"
          }
          }
          }





          share|improve this answer
























          • I can work well, thanks.

            – huangjs
            Nov 23 '18 at 1:32














          0












          0








          0







          Your search query returns all documents containing the tokens AK & ARK in the inverted index and this matches all the 3 docs and is working as expected.



          If you want to return documents containing AK followed by ARK you should use match_phrase query like below which returns doc2 and doc3 as they contain AK followed by ARK.



          GET /_search
          {
          "query": {
          "match_phrase" : {
          "myfield" : "AKARK"
          }
          }
          }





          share|improve this answer













          Your search query returns all documents containing the tokens AK & ARK in the inverted index and this matches all the 3 docs and is working as expected.



          If you want to return documents containing AK followed by ARK you should use match_phrase query like below which returns doc2 and doc3 as they contain AK followed by ARK.



          GET /_search
          {
          "query": {
          "match_phrase" : {
          "myfield" : "AKARK"
          }
          }
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 '18 at 22:07









          ben5556ben5556

          1,9322310




          1,9322310













          • I can work well, thanks.

            – huangjs
            Nov 23 '18 at 1:32



















          • I can work well, thanks.

            – huangjs
            Nov 23 '18 at 1:32

















          I can work well, thanks.

          – huangjs
          Nov 23 '18 at 1:32





          I can work well, thanks.

          – huangjs
          Nov 23 '18 at 1:32


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431895%2fhow-to-retrieve-the-documents-containing-a-specific-term-followed-by-another-spe%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Create new schema in PostgreSQL using DBeaver

          Deepest pit of an array with Javascript: test on Codility

          Costa Masnaga