forked from docs/doc-exports
Reviewed-by: Pruthi, Vineet <vineet.pruthi@t-systems.com> Co-authored-by: Lu, Huayi <luhuayi@huawei.com> Co-committed-by: Lu, Huayi <luhuayi@huawei.com>
86 lines
12 KiB
HTML
86 lines
12 KiB
HTML
<a name="EN-US_TOPIC_0000001188588984"></a><a name="EN-US_TOPIC_0000001188588984"></a>
|
|
|
|
<h1 class="topictitle1">Rewriting Queries</h1>
|
|
<div id="body8662426"><p id="EN-US_TOPIC_0000001188588984__a977b602e178f4c61a4bfe369de2f3d39">The <strong id="EN-US_TOPIC_0000001188588984__b842352706104855">ts_rewrite</strong> function searches a given <strong id="EN-US_TOPIC_0000001188588984__b842352706104852">tsquery</strong> for occurrences of a target subquery, and replace each occurrence with a substitute subquery. In essence this operation is a <strong id="EN-US_TOPIC_0000001188588984__b842352706104918">tsquery</strong> specific version of substring replacement. A target and substitute combination can be thought of as a query rewrite rule. A collection of such rewrite rules can be a powerful search aid. For example, you can expand the search using synonyms (that is, <strong id="EN-US_TOPIC_0000001188588984__b530614388534">new york</strong>, <strong id="EN-US_TOPIC_0000001188588984__b13538124211535">big apple</strong>, <strong id="EN-US_TOPIC_0000001188588984__b992814449531">nyc</strong>, <strong id="EN-US_TOPIC_0000001188588984__b991694695319">gotham</strong>) or narrow the search to direct the user to some hot topic. </p>
|
|
<ul id="EN-US_TOPIC_0000001188588984__uad3d7ac7454747f89d65f3799e145be7"><li id="EN-US_TOPIC_0000001188588984__ld489010cab7b43aa8123f758f80b58c2">ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns tsquery<p id="EN-US_TOPIC_0000001188588984__a003a7bc3457849a38047840febdfc25d"><a name="EN-US_TOPIC_0000001188588984__ld489010cab7b43aa8123f758f80b58c2"></a><a name="ld489010cab7b43aa8123f758f80b58c2"></a>This form of <strong id="EN-US_TOPIC_0000001188588984__b84235270610511">ts_rewrite</strong> simply applies a single rewrite rule: <strong id="EN-US_TOPIC_0000001188588984__b84235270610514">target</strong> is replaced by <strong id="EN-US_TOPIC_0000001188588984__b842352706105118">substitute</strong> wherever it appears in query. For example:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188588984__s32b3a574303243039aeb82ed93800718"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="s1">'a & b'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'a'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'c'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">ts_rewrite</span>
|
|
<span class="c1">------------</span>
|
|
<span class="w"> </span><span class="s1">'b'</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="s1">'c'</span>
|
|
<span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li><li id="EN-US_TOPIC_0000001188588984__l1f7d1a99f88a4ce380cac5fe6bb1de34">ts_rewrite (query tsquery, select text) returns tsquery<p id="EN-US_TOPIC_0000001188588984__a402f5680103546a58df6804467bf17ad"><a name="EN-US_TOPIC_0000001188588984__l1f7d1a99f88a4ce380cac5fe6bb1de34"></a><a name="l1f7d1a99f88a4ce380cac5fe6bb1de34"></a>This form of <strong id="EN-US_TOPIC_0000001188588984__b842352706105240">ts_rewrite</strong> accepts a starting query and a SQL select command, which is given as a text string. The <strong id="EN-US_TOPIC_0000001188588984__b842352706105237">select</strong> must yield two columns of <strong id="EN-US_TOPIC_0000001188588984__b842352706105235">tsquery</strong> type. For each row of the select result, occurrences of the first column value (the target) are replaced by the second column value (the substitute) within the current <strong id="EN-US_TOPIC_0000001188588984__b842352706105318">query</strong> value.</p>
|
|
<div class="note" id="EN-US_TOPIC_0000001188588984__nc2d584d36e084bf187b0226625b0b9ec"><img src="public_sys-resources/note_3.0-en-us.png"><span class="notetitle"> </span><div class="notebody"><p id="EN-US_TOPIC_0000001188588984__aa923ee59847c4bcea5316a09e52de785">Note that when multiple rewrite rules are applied in this way, the order of application can be important; so in practice you will want the source query to <strong id="EN-US_TOPIC_0000001188588984__b84235270610540">ORDER BY</strong> some ordering key.</p>
|
|
</div></div>
|
|
<p id="EN-US_TOPIC_0000001188588984__a6b574a8772a54444a86cfb00c6b41508">Consider a real-life astronomical example. We will expand query supernovae using table-driven rewriting rules:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188588984__s0b65d163c68b4866b1ec5c01e9c8e3de"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="w"> </span><span class="nb">int</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="n">tsquery</span><span class="p">);</span>
|
|
|
|
<span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span><span class="w"> </span><span class="k">VALUES</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae'</span><span class="p">),</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae|sn'</span><span class="p">));</span>
|
|
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae & crab'</span><span class="p">),</span><span class="w"> </span><span class="s1">'SELECT t, s FROM tsearch.aliases'</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
|
|
<span class="c1">---------------------------------</span>
|
|
<span class="w"> </span><span class="s1">'crab'</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="s1">'supernova'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="s1">'sn'</span><span class="w"> </span><span class="p">)</span>
|
|
<span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188588984__acb24798039c347ed8a8c4e83c60ac31d">We can change the rewriting rules just by updating the table:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188588984__s2c39d2db22fe4a18b205a758db9dc0ed"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span>
|
|
<span class="normal">7</span>
|
|
<span class="normal">8</span>
|
|
<span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">UPDATE</span><span class="w"> </span><span class="n">tsearch</span><span class="p">.</span><span class="n">aliases</span>
|
|
<span class="k">SET</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae|sn & !nebulae'</span><span class="p">)</span>
|
|
<span class="k">WHERE</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae'</span><span class="p">);</span>
|
|
|
|
<span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="n">to_tsquery</span><span class="p">(</span><span class="s1">'supernovae & crab'</span><span class="p">),</span><span class="w"> </span><span class="s1">'SELECT t, s FROM tsearch.aliases'</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
|
|
<span class="c1">---------------------------------------------</span>
|
|
<span class="w"> </span><span class="s1">'crab'</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="s1">'supernova'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="s1">'sn'</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="o">!</span><span class="s1">'nebula'</span><span class="w"> </span><span class="p">)</span>
|
|
<span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
<p id="EN-US_TOPIC_0000001188588984__a5733ca6c0ea14302a914da74d129a652">Rewriting can be slow when there are many rewriting rules, since it checks every rule for a possible match. To filter out obvious non-candidate rules we can use the containment operators for the <strong id="EN-US_TOPIC_0000001188588984__b13376597174">tsquery</strong> type. In the example below, we select only those rules which might match the original query:</p>
|
|
<div class="codecoloring" codetype="Sql" id="EN-US_TOPIC_0000001188588984__sd2d670801ddf414b9c5819ef5aeb2bf0"><div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
|
|
<span class="normal">2</span>
|
|
<span class="normal">3</span>
|
|
<span class="normal">4</span>
|
|
<span class="normal">5</span>
|
|
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><span class="k">SELECT</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">(</span><span class="s1">'a & b'</span><span class="p">::</span><span class="n">tsquery</span><span class="p">,</span><span class="w"> </span><span class="s1">'SELECT t,s FROM tsearch.aliases WHERE ''a & b''::tsquery @> t'</span><span class="p">);</span>
|
|
<span class="w"> </span><span class="n">ts_rewrite</span><span class="w"> </span>
|
|
<span class="c1">------------</span>
|
|
<span class="w"> </span><span class="s1">'b'</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="s1">'a'</span>
|
|
<span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="k">row</span><span class="p">)</span>
|
|
<span class="k">DROP</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">ts_rewrite</span><span class="p">;</span>
|
|
</pre></div></td></tr></table></div>
|
|
|
|
</div>
|
|
</li></ul>
|
|
</div>
|
|
<div>
|
|
<div class="familylinks">
|
|
<div class="parentlink"><strong>Parent topic:</strong> <a href="dws_06_0096.html">Additional Features</a></div>
|
|
</div>
|
|
</div>
|
|
|