<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Join indexes on field that contain. in Splunk Search</title>
    <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754182#M242832</link>
    <description>&lt;P&gt;Let me reconstruct this step by step. &amp;nbsp;No matter what technique you choose, matching logic is the key question.&lt;/P&gt;&lt;BLOCKQUOTE&gt;in search 1 the title will be something like "Update Nvidea GeForce"&lt;BR /&gt;&lt;BR /&gt;in search two description will be something like "March: Low - Update Nvidea Geforce"&lt;/BLOCKQUOTE&gt;&lt;P&gt;The above is from OP. &amp;nbsp;Is &lt;FONT face="courier new,courier"&gt;description&lt;/FONT&gt; always composed of some sort of classifier ("March: Low") followed by a dash then &lt;FONT face="courier new,courier"&gt;title&lt;/FONT&gt;? &amp;nbsp;I know that you mentioned a version of your implementation as "not a proper solution". &amp;nbsp;Can you elaborate why? &amp;nbsp;Because you have never described matching logic in detail (including what kind of characters/strings have to throw off any specific implementation), this is the simplest I can think of. &amp;nbsp;So I will assume that it IS the proper solution - maybe it was your implementation that had a problem:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval match_key = coalesce(title,
  mvindex(split(description, " - "), 1, -1))&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, in another reply, you said&lt;/P&gt;&lt;BLOCKQUOTE&gt;"falcon_spotlight.remediation.entities{}.title" will contain "Update Nvidea Geforce" And description might contain the same as the title but have more information, "March - Low Update Nvidea Geforce"&lt;/BLOCKQUOTE&gt;&lt;P&gt;This example quite contradicts the example in the OP. &amp;nbsp;What is the real logic? &amp;nbsp;Is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;title&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;always contained in &lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;description&lt;/FONT&gt;&lt;SPAN&gt;? &amp;nbsp;Your third illustrated SPL seems to suggest so. &amp;nbsp;This more generic logic can be expressed in the following:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval match_key = if(description LIKE "%" . title . "%", title, null())&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;The second strategy is doable but much more expensive in practice. &amp;nbsp;So, I will focus on the simpler strategy.&lt;/P&gt;&lt;P&gt;The above two snippets are just concepts expressed in SPL, not a solution. &amp;nbsp;To really construct something usable, let me circle back to&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/231884"&gt;@PickleRick&lt;/a&gt;'s comment about &lt;FONT face="courier new,courier"&gt;join&lt;/FONT&gt;: only use as a last resort.&lt;/P&gt;&lt;P&gt;Next, let's try to find a usable solution. &amp;nbsp;I will first illustrate the most commonly recommended method, i.e., use one index search to include all necessary events.&lt;/P&gt;&lt;P&gt;You haven't told us how the desired result should look like. So, I can only speculate based on the third SPL you illustrated: You want select stats grouped by the short title. &amp;nbsp;Here is the first method:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;(index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json" 
  "falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
  ``` of interest: falcon_spotlight.remediation.entities{}.title, falcon_spotlight.host_info.hostname ```
  ) OR (
    index=db_service_now sourcetype="snow:incident" status!="Resolved" status!="Closed" affect_dest="CrowdStrike Vulnerability Management"
    ``` of interest: number description priority status assignment_group_name assignment_user_name ```
  )
| rename falcon_spotlight.host_info.hostname as host
| eval title = coalesce(trim('falcon_spotlight.remediation.entities{}.title'),
    mvindex(split(description, " - "), 1, -1))
| mvexpand title
| stats
    dc(host)                              AS host_count
    values(host)                          AS hosts
    values(number)                        AS snow_numbers
    values(status)                        AS snow_status
    values(priority)                      AS snow_priority
    values(assignment_group_name)         AS snow_group
    values(assignment_user_name)          AS snow_assignee
    dc(number)                            AS snow_count
  BY title
| eval has_ticket=if(snow_count&amp;gt;0,"Yes","No")
| table cs_title host_count has_ticket snow_count snow_numbers snow_status snow_priority snow_group snow_assignee
| sort -has_ticket -host_count&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here, I removed a lot of calculations that I believe are not necessary, such as makemv (flattened JSON array elements falcon_spotlight.remediation.entities{}.* are already multivalue; they are NOT newline delimited), mvsort (any values output is already sorted lexically), etc.&lt;/P&gt;&lt;P&gt;The only expensive calculation in the above is mvexpand. &amp;nbsp;You may get inconsistent data if there are too many events.&lt;/P&gt;&lt;P&gt;A second method is as&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/170906"&gt;@livehybrid&lt;/a&gt;&amp;nbsp;suggested, using append. &amp;nbsp;It only marginally reduces the mvexpand problem; it can introduce a different memory problem although I believe db_service_now events are a lot sparser so it is probably not immaterial.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;(index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json" 
  "falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
  ``` of interest: falcon_spotlight.remediation.entities{}.title, falcon_spotlight.host_info.hostname ```
| rename falcon_spotlight.host_info.hostname as host
| eval title = trim('falcon_spotlight.remediation.entities{}.title')
| mvexpand title
| append
    [ search
      index=db_service_now sourcetype="snow:incident" status!="Resolved" status!="Closed" affect_dest="CrowdStrike Vulnerability Management"
      ``` of interest: number description priority status assignment_group_name assignment_user_name ```
    | dedup number
    | eval title = mvindex(split(description, " - "), 1, -1)
    ]
| stats
    dc(host)                              AS host_count
    values(host)                          AS hosts
    values(number)                        AS snow_numbers
    values(status)                        AS snow_status
    values(priority)                      AS snow_priority
    values(assignment_group_name)         AS snow_group
    values(assignment_user_name)          AS snow_assignee
    dc(number)                            AS snow_count
  BY title
| eval has_ticket=if(snow_count&amp;gt;0,"Yes","No")
| table cs_title host_count has_ticket snow_count snow_numbers snow_status snow_priority snow_group snow_assignee
| sort -has_ticket -host_count&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note in both approaches, you want to create that match key in respective datasets first.&lt;/P&gt;&lt;P&gt;Of course, if service_now's "description" is free text and does not follow a predefined pattern as to how they match title in crowdstrike, you will need to use the second matching strategy. &amp;nbsp;However, the calculation will be even more expensive than just eventstats suggested by&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/6367"&gt;@bowesmana&lt;/a&gt;&amp;nbsp;. &amp;nbsp;Let us know if you are this unfortunate.&lt;/P&gt;</description>
    <pubDate>Sat, 11 Oct 2025 07:13:35 GMT</pubDate>
    <dc:creator>yuanliu</dc:creator>
    <dc:date>2025-10-11T07:13:35Z</dc:date>
    <item>
      <title>Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754086#M242820</link>
      <description>&lt;P&gt;Good day, It's been a while.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I am trying to join two indexes together to see if a ticket has been logged based on the first search.&lt;BR /&gt;&lt;BR /&gt;Search 1:&amp;nbsp;&lt;BR /&gt;Is used to gather all the results. Here we will be using title, as our main source. (But we dont want to through away all the other colums)&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json" 
"falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
| makemv delim="\n" "falcon_spotlight.remediation.entities{}.title"
| mvexpand "falcon_spotlight.remediation.entities{}.title"
| stats values("falcon_spotlight.host_info.hostname") as hosts dc("falcon_spotlight.host_info.hostname") as host_count by "falcon_spotlight.remediation.entities{}.title"
| eval hosts=mvsort(hosts)
| table "falcon_spotlight.remediation.entities{}.title" host_count&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;Search 2:&lt;BR /&gt;Is used to gather all the tickets logged to our ITSM.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index=db_service_now sourcetype="snow:incident" status!="Resolved" status!="Closed" affect_dest="CrowdStrike Vulnerability Management"
| dedup number description
| table _time active "number" "affect_dest" "description" "dv_description" "dv_impact" "priority" "status" "assignment_group_name" "assignment_user_name" "close_code" "close_notes" "closed_at" "short_description"&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;BR /&gt;in search 1 the title will be something like "Update Nvidea GeForce"&lt;BR /&gt;&lt;BR /&gt;in search two description will be something like "March: Low - Update Nvidea Geforce"&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json"
"falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
| makemv delim="\n" "falcon_spotlight.remediation.entities{}.title"
| mvexpand "falcon_spotlight.remediation.entities{}.title"
| eval cs_title=trim('falcon_spotlight.remediation.entities{}.title')
| where len(cs_title)&amp;gt;0                                 
| stats values('falcon_spotlight.host_info.hostname') AS hosts
        dc('falcon_spotlight.host_info.hostname') AS host_count
  BY cs_title
| eval hosts=mvsort(hosts), lc_title=lower(cs_title), key=1
| join type=left max=0 key [
    search index=db_service_now sourcetype="snow:incident"
          status!="Resolved" status!="Closed"
          affect_dest="CrowdStrike Vulnerability Management"
    | dedup number                                   
    | eval desc=lower(coalesce(dv_description, description, short_description))
    | eval key=1
    | fields key number status priority assignment_group_name assignment_user_name desc
]
| eval matched = if(like(desc, "%" . lc_title . "%"), 1, 0)
| eval number                = if(matched=1, number, null())
| eval status                = if(matched=1, status, null())
| eval priority              = if(matched=1, priority, null())
| eval assignment_group_name = if(matched=1, assignment_group_name, null())
| eval assignment_user_name  = if(matched=1, assignment_user_name,  null())
| stats
    max(host_count)                       AS host_count
    values(hosts)                         AS hosts
    values(number)                        AS snow_numbers
    values(status)                        AS snow_status
    values(priority)                      AS snow_priority
    values(assignment_group_name)         AS snow_group
    values(assignment_user_name)          AS snow_assignee
    sum(matched)                          AS snow_count
  BY cs_title
| eval has_ticket=if(snow_count&amp;gt;0,"Yes","No")
| dedup snow_numbers
| table cs_title host_count has_ticket snow_count snow_numbers snow_status snow_priority snow_group snow_assignee
| sort -has_ticket -host_count&lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;How can I combine my searches to search the second one where it contains the first title field?&lt;BR /&gt;This is what I tried but it is not completely what I am looking for&lt;BR /&gt;Any assistance would be greatly appreciated!&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 08 Oct 2025 12:04:25 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754086#M242820</guid>
      <dc:creator>JandrevdM</dc:creator>
      <dc:date>2025-10-08T12:04:25Z</dc:date>
    </item>
    <item>
      <title>Re: Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754088#M242821</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/270694"&gt;@JandrevdM&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Im not usually a fan of append however could work here if your appended query has less than 50,000 results.&lt;/P&gt;&lt;P&gt;Not currently on a proper browser so hard to write out, but If both have the shared field "short_description" then you can do something like:&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;`query_1` 
| append [`query_2`]
| stats values(*) as * by short_description&lt;/LI-CODE&gt;&lt;P&gt;You could then use a where command to filter out anything which does not have a values in the expected fields leaving just those which are present in both.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-unicode-emoji" title=":glowing_star:"&gt;🌟&lt;/span&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Did this answer help you?&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;If so, please consider:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Adding karma to show it was useful&lt;/LI&gt;&lt;LI&gt;Marking it as the solution if it resolved your issue&lt;/LI&gt;&lt;LI&gt;Commenting if you need any clarification&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Your feedback encourages the volunteers in this community to continue contributing&lt;/P&gt;</description>
      <pubDate>Wed, 08 Oct 2025 12:33:17 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754088#M242821</guid>
      <dc:creator>livehybrid</dc:creator>
      <dc:date>2025-10-08T12:33:17Z</dc:date>
    </item>
    <item>
      <title>Re: Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754090#M242822</link>
      <description>&lt;P&gt;Thank you for the assistance, unfortunately I do not have a shared field and did try append.&lt;BR /&gt;&lt;BR /&gt;"falcon_spotlight.remediation.entities{}.title" will contain "Update Nvidea Geforce"&lt;BR /&gt;And description might contain the same as the title but have more information,&amp;nbsp;&lt;BR /&gt;"March - Low Update Nvidea Geforce"&lt;BR /&gt;&lt;BR /&gt;I event tried to remove certain words to make a matching filed but that will not be a proper solution&lt;BR /&gt;So it is more a if search 2 description contains the title and not match.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 08 Oct 2025 13:08:07 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754090#M242822</guid>
      <dc:creator>JandrevdM</dc:creator>
      <dc:date>2025-10-08T13:08:07Z</dc:date>
    </item>
    <item>
      <title>Re: Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754112#M242823</link>
      <description>&lt;P&gt;1. Since you're trying to join on a&amp;nbsp;&lt;EM&gt;key&lt;/EM&gt; field and you set this field to be equal to 1 everywhere (for every event in both sets) it will definitely not work properly.&lt;/P&gt;&lt;P&gt;2. Join is generally a limited command which should be avoided if possible.&lt;/P&gt;&lt;P&gt;3.&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/170906"&gt;@livehybrid&lt;/a&gt;&amp;nbsp;'s idea with append might be OK but if you had only streaming command you could use multisearch instead&lt;/P&gt;&lt;P&gt;4. But generally what you're trying to do is not available as such. You can't "join" by partial text matching. The only way of achieving something similar to what you're trying to do would be to create a lookup definition with a wildcard match type and then do two separate searches. With one search you'd create a set of patterns and output them to a lookup. And then with a separate search you'd use that lookup for matching. But it will not be efficient. Splunk will need to try to match each lookup entry to each event so you'd have O(m*n) complexity.&lt;/P&gt;</description>
      <pubDate>Wed, 08 Oct 2025 18:58:01 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754112#M242823</guid>
      <dc:creator>PickleRick</dc:creator>
      <dc:date>2025-10-08T18:58:01Z</dc:date>
    </item>
    <item>
      <title>Re: Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754114#M242824</link>
      <description>&lt;P&gt;I have used a technique which can work, depending on data volumes and cardinality. Using append to collect both datasets together, then you can use&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eventstats values(cs_title) as titles
| eval titles=if(isnotnull(cs_title), null(), titles)&lt;/LI-CODE&gt;&lt;P&gt;which will collect ALL titles in q1 into every event from q2 - it collects every title to every event then drops the field from q1 events. What this is doing it to push all titles into a field for all q2 events which can then be matched against, a bit like a dynamic runtime lookup.&amp;nbsp;&lt;/P&gt;&lt;P&gt;and then you can follow that with a match, e.g.&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval matching_title=mvmap(titles, if(match(description, "(?i)".titles), titles, null()))
| fields - titles&lt;/LI-CODE&gt;&lt;P&gt;which will set a new field &lt;STRONG&gt;&lt;EM&gt;matching_title&lt;/EM&gt;&lt;/STRONG&gt; which will be non-null if a match can be found - NB- it will do case insensitive match.&lt;/P&gt;&lt;P&gt;This can use a lot of memory if you have lots of titles, but works.&lt;/P&gt;&lt;P&gt;Note that there are some other optimisations you should do in your Q1 - ALWAYS limit the fields you want in the expanded events before using mvexpand. Particulary, make sure you exclude _raw as _raw JSON is generally always unnecessary and will be duplicated for every expanded event.&lt;/P&gt;&lt;P&gt;You should not need to use mvsort on a field that has come from stats values(), as the output from values is always sorted.&lt;/P&gt;</description>
      <pubDate>Thu, 09 Oct 2025 22:44:17 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754114#M242824</guid>
      <dc:creator>bowesmana</dc:creator>
      <dc:date>2025-10-09T22:44:17Z</dc:date>
    </item>
    <item>
      <title>Re: Join indexes on field that contain.</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754182#M242832</link>
      <description>&lt;P&gt;Let me reconstruct this step by step. &amp;nbsp;No matter what technique you choose, matching logic is the key question.&lt;/P&gt;&lt;BLOCKQUOTE&gt;in search 1 the title will be something like "Update Nvidea GeForce"&lt;BR /&gt;&lt;BR /&gt;in search two description will be something like "March: Low - Update Nvidea Geforce"&lt;/BLOCKQUOTE&gt;&lt;P&gt;The above is from OP. &amp;nbsp;Is &lt;FONT face="courier new,courier"&gt;description&lt;/FONT&gt; always composed of some sort of classifier ("March: Low") followed by a dash then &lt;FONT face="courier new,courier"&gt;title&lt;/FONT&gt;? &amp;nbsp;I know that you mentioned a version of your implementation as "not a proper solution". &amp;nbsp;Can you elaborate why? &amp;nbsp;Because you have never described matching logic in detail (including what kind of characters/strings have to throw off any specific implementation), this is the simplest I can think of. &amp;nbsp;So I will assume that it IS the proper solution - maybe it was your implementation that had a problem:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval match_key = coalesce(title,
  mvindex(split(description, " - "), 1, -1))&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;However, in another reply, you said&lt;/P&gt;&lt;BLOCKQUOTE&gt;"falcon_spotlight.remediation.entities{}.title" will contain "Update Nvidea Geforce" And description might contain the same as the title but have more information, "March - Low Update Nvidea Geforce"&lt;/BLOCKQUOTE&gt;&lt;P&gt;This example quite contradicts the example in the OP. &amp;nbsp;What is the real logic? &amp;nbsp;Is&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;title&lt;/FONT&gt;&lt;SPAN&gt;&amp;nbsp;always contained in &lt;/SPAN&gt;&lt;FONT face="courier new,courier"&gt;description&lt;/FONT&gt;&lt;SPAN&gt;? &amp;nbsp;Your third illustrated SPL seems to suggest so. &amp;nbsp;This more generic logic can be expressed in the following:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;| eval match_key = if(description LIKE "%" . title . "%", title, null())&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;The second strategy is doable but much more expensive in practice. &amp;nbsp;So, I will focus on the simpler strategy.&lt;/P&gt;&lt;P&gt;The above two snippets are just concepts expressed in SPL, not a solution. &amp;nbsp;To really construct something usable, let me circle back to&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/231884"&gt;@PickleRick&lt;/a&gt;'s comment about &lt;FONT face="courier new,courier"&gt;join&lt;/FONT&gt;: only use as a last resort.&lt;/P&gt;&lt;P&gt;Next, let's try to find a usable solution. &amp;nbsp;I will first illustrate the most commonly recommended method, i.e., use one index search to include all necessary events.&lt;/P&gt;&lt;P&gt;You haven't told us how the desired result should look like. So, I can only speculate based on the third SPL you illustrated: You want select stats grouped by the short title. &amp;nbsp;Here is the first method:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;(index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json" 
  "falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
  ``` of interest: falcon_spotlight.remediation.entities{}.title, falcon_spotlight.host_info.hostname ```
  ) OR (
    index=db_service_now sourcetype="snow:incident" status!="Resolved" status!="Closed" affect_dest="CrowdStrike Vulnerability Management"
    ``` of interest: number description priority status assignment_group_name assignment_user_name ```
  )
| rename falcon_spotlight.host_info.hostname as host
| eval title = coalesce(trim('falcon_spotlight.remediation.entities{}.title'),
    mvindex(split(description, " - "), 1, -1))
| mvexpand title
| stats
    dc(host)                              AS host_count
    values(host)                          AS hosts
    values(number)                        AS snow_numbers
    values(status)                        AS snow_status
    values(priority)                      AS snow_priority
    values(assignment_group_name)         AS snow_group
    values(assignment_user_name)          AS snow_assignee
    dc(number)                            AS snow_count
  BY title
| eval has_ticket=if(snow_count&amp;gt;0,"Yes","No")
| table cs_title host_count has_ticket snow_count snow_numbers snow_status snow_priority snow_group snow_assignee
| sort -has_ticket -host_count&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here, I removed a lot of calculations that I believe are not necessary, such as makemv (flattened JSON array elements falcon_spotlight.remediation.entities{}.* are already multivalue; they are NOT newline delimited), mvsort (any values output is already sorted lexically), etc.&lt;/P&gt;&lt;P&gt;The only expensive calculation in the above is mvexpand. &amp;nbsp;You may get inconsistent data if there are too many events.&lt;/P&gt;&lt;P&gt;A second method is as&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/170906"&gt;@livehybrid&lt;/a&gt;&amp;nbsp;suggested, using append. &amp;nbsp;It only marginally reduces the mvexpand problem; it can introduce a different memory problem although I believe db_service_now events are a lot sparser so it is probably not immaterial.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;(index="db_crowdstrike" sourcetype="crowdstrike:spotlight:vulnerability:json" 
  "falcon_spotlight.status"!="closed" "falcon_spotlight.suppression_info.is_suppressed"="false"
  ``` of interest: falcon_spotlight.remediation.entities{}.title, falcon_spotlight.host_info.hostname ```
| rename falcon_spotlight.host_info.hostname as host
| eval title = trim('falcon_spotlight.remediation.entities{}.title')
| mvexpand title
| append
    [ search
      index=db_service_now sourcetype="snow:incident" status!="Resolved" status!="Closed" affect_dest="CrowdStrike Vulnerability Management"
      ``` of interest: number description priority status assignment_group_name assignment_user_name ```
    | dedup number
    | eval title = mvindex(split(description, " - "), 1, -1)
    ]
| stats
    dc(host)                              AS host_count
    values(host)                          AS hosts
    values(number)                        AS snow_numbers
    values(status)                        AS snow_status
    values(priority)                      AS snow_priority
    values(assignment_group_name)         AS snow_group
    values(assignment_user_name)          AS snow_assignee
    dc(number)                            AS snow_count
  BY title
| eval has_ticket=if(snow_count&amp;gt;0,"Yes","No")
| table cs_title host_count has_ticket snow_count snow_numbers snow_status snow_priority snow_group snow_assignee
| sort -has_ticket -host_count&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note in both approaches, you want to create that match key in respective datasets first.&lt;/P&gt;&lt;P&gt;Of course, if service_now's "description" is free text and does not follow a predefined pattern as to how they match title in crowdstrike, you will need to use the second matching strategy. &amp;nbsp;However, the calculation will be even more expensive than just eventstats suggested by&amp;nbsp;&lt;a href="https://community.splunk.com/t5/user/viewprofilepage/user-id/6367"&gt;@bowesmana&lt;/a&gt;&amp;nbsp;. &amp;nbsp;Let us know if you are this unfortunate.&lt;/P&gt;</description>
      <pubDate>Sat, 11 Oct 2025 07:13:35 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Join-indexes-on-field-that-contain/m-p/754182#M242832</guid>
      <dc:creator>yuanliu</dc:creator>
      <dc:date>2025-10-11T07:13:35Z</dc:date>
    </item>
  </channel>
</rss>

